使用 WebSocket 创建持久连接

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

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

WebSocket

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

WebSocket 的典型使用场景包括:

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

WebSocket 随时可供应用使用,而无需进行任何额外的设置。WebSocket 连接会在建立 1 小时后超时。

使用 WebSocket 运行示例应用

首先,按照 App Engine 上的 Go 版“Hello, World!”中的说明来设置您的环境和项目,并了解如何设计 App Engine Go 应用的结构。

克隆示例应用

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

git clone https://github.com/GoogleCloudPlatform/golang-samples
cd golang-samples/appengine_flexible/websockets/

在本地运行示例

要在本地计算机上运行示例应用,请执行以下操作:

  1. 启动本地网络服务器。

    go run *.go
    
  2. 在网络浏览器中输入以下地址:

    http://localhost:8080
    

在 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