使用 WebSocket 创建持久连接

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的地区分配的缩写代码。此代码不对应于国家/地区或省,尽管某些地区 ID 可能类似于常用国家/地区代码和省代码。在 App Engine 网址中包含 REGION_ID.r 对于现有应用是可选项,但在不久后将成为所有新应用的必要项。

为了确保顺利过渡,我们正在逐步更新 App Engine 以使用地区 ID。如果我们尚未更新您的 Google Cloud 项目,则您不会看到应用的区域 ID。由于该 ID 对于现有应用是可选的,因此您在现有应用可以使用区域 ID 后无需更新网址或进行其他更改。

详细了解区域 ID

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

WebSocket

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

WebSocket 的典型使用场景包括:

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

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

使用 WebSocket 运行示例应用

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

克隆示例应用

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

git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
cd ruby-docs-samples/appengine/websockets/

在本地运行示例

  1. 安装此项目的依赖项。

    bundle install
    
  2. 启动本地网络服务器。

    bundle exec ruby app.rb -p 8080
    
  3. 在网络浏览器中输入以下地址:

    http://localhost:8080
    

在 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