使用 WebSocket 创建持久连接

您可以使用 WebSocket 创建从客户端(例如移动设备或计算机)到 App Engine 实例的持久连接。只要连接处于打开状态,客户端与服务器之间可随时进行双向数据交换,从而缩短延迟时间,并更好地利用资源。

WebSockets

WebSocket 协议(定义详见 RFC 6455)提供了客户端和服务器之间的全双工通信通道。该通道是通过包含“upgrade”标头的 HTTP(S) 请求启动的。

WebSocket 的典型使用场景包括:

  • 实时事件更新,例如社交媒体 Feed、赛事比分、新闻或股票市场价格
  • 用户通知,例如软件或内容更新
  • 聊天应用
  • 协作编辑工具
  • 多人游戏

WebSocket 随时可供应用使用,而无需进行任何额外的设置。WebSocket 连接会在建立 1 小时后超时。 WebSocket 的使用按连接使用量计费,直到超时或套接字终止。

使用 WebSocket 运行示例应用

前提条件和设置

本文档中的代码示例介绍了对于 Python 运行时 3.7 版及更低版本,如何使用 WebSocket 运行示例应用WebSocket。

请按照设置开发环境中的说明来设置环境和项目,并了解如何设计应用的结构。

克隆示例应用

将示例应用复制到本地机器,然后导航到 websockets 目录:

在本地运行示例

在 App Engine 上部署和运行示例应用

会话亲和性

并非所有客户端都支持 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