您可以使用 WebSocket 创建从客户端(例如移动设备或计算机)到 App Engine 实例的持久连接。只要连接处于打开状态,客户端与服务器之间可随时进行双向数据交换,从而缩短延迟时间,并更好地利用资源。
WebSockets
WebSocket 协议(定义详见 RFC 6455)提供了客户端和服务器之间的全双工通信通道。该通道是通过包含“upgrade”标头的 HTTP(S) 请求启动的。
WebSocket 的典型使用场景包括:
- 实时事件更新,例如社交媒体 Feed、赛事比分、新闻或股票市场价格
- 用户通知,例如软件或内容更新
- 聊天应用
- 协作编辑工具
- 多人游戏
WebSocket 随时可供应用使用,而无需进行任何额外的设置。WebSocket 连接会在建立 1 小时后超时。 WebSocket 的使用按连接使用量计费,直到超时或套接字终止。
使用 WebSocket 运行示例应用
前提条件和设置
本文档中的代码示例介绍了对于 Python 运行时 3.7 版及更低版本,如何使用 WebSocket 运行示例应用。对于 Python 3.8 版及更高版本,请参阅 Python 运行时,详细了解如何使用新版本。
请按照设置开发环境中的说明来设置环境和项目,并了解如何设计应用的结构。
克隆示例应用
将示例应用复制到本地机器,然后导航到 websockets
目录:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible_python37_and_earlier/websockets/
在本地运行示例
要在本地运行,您需要搭配使用 Gunicorn 和 flask_socket
工作器:
$ gunicorn -b 127.0.0.1:8080 -k flask_sockets.worker main:app
在 App Engine 上部署和运行示例应用
如需将应用部署到 App Engine 柔性环境,请从 app.yaml
所在的目录运行以下命令:
gcloud app deploy
然后,您可以将浏览器定向到 https://PROJECT_ID.REGION_ID.r.appspot.com
会话亲和性
并非所有客户端都支持 WebSocket。为了解决这个问题,许多应用都会使用 socket.io 之类的库,这些库在客户端不支持 WebSocket 时会回退为使用 http 长轮询。
App Engine 通常会在可用实例之间均匀地分配请求,但如果使用 http 长轮询,由同一给定用户发出的多个连续请求就需要分配到同一个实例。
为了使 App Engine 能够将同一个用户发出的多个请求发送到同一个实例,您可以启用会话亲和性。App Engine 会通过检查 Cookie 来识别哪些请求是由同一个用户发送的,然后将这些请求路由到同一个实例。
App Engine 会尽最大努力实现会话亲和性。在开发应用时,您应该始终假设会话亲和性不一定会实现。在以下情况下,客户端可能会失去与目标实例的亲和性:
- App Engine 自动调节程序可以添加或移除用于处理应用负载的实例。应用可能会重新分配负载,而目标实例也可能会移动。为了将此风险将至最低,请务必设置用于处理预期负载的最小实例数。
- 如果目标实例未通过健康检查,App Engine 便会将相应会话移至健康状况良好的实例。如需详细了解健康检查及其自定义选项,请参阅分组健康检查。
- 如果系统为了进行维护或软件更新而重新启动实例,会话亲和性便会丢失。App Engine 柔性环境中的虚拟机实例每周重启一次。
由于会话亲和性得不到保证,因此您应该仅通过它来充分利用 socket.io
和其他库的能力,在连接断开的情况下借助于 HTTP 长轮询处理请求。切勿使用会话亲和性来构建有状态应用。
启用和停用会话亲和性
默认情况下,系统会对所有 App Engine 应用停用会话亲和性。会话亲和性是在应用的版本级别设置的,并可在部署时启用或停用。
如需为您的 App Engine 版本启用会话关联,请将以下条目添加到 app.yaml
文件中:
network:
session_affinity: true
使用更新的 app.yaml 文件部署版本后,新请求便开始由同一实例处理(只要该实例可用)。
如需停用会话亲和性,请从 app.yaml
文件中移除该条目,或将其值设置为 false:
network:
session_affinity: false