2

假设我们有多个使用 Channel API 连接到 App Engine 的客户端。每个客户端发送消息,这些消息应该根据一些规则传播给其他连接的客户端。棘手的部分是客户端可能不在同一个 App Engine 实例上。

有没有办法数据从一个实例推送到其他实例?

(是的,我知道 Memcache,但这需要某种轮询。)

4

3 回答 3

3

你在这里问两个问题。

一种。您可以在不使用轮询的情况下将数据从一个实例推送到另一个实例吗?答案一般是否定的。

湾。一个客户端可以向服务器发送可以传播给其他客户端的消息吗?是的,这不需要将消息传播到其他服务器端实例。

将 Channel API 视为一种服务。客户端连接到 Channel API 服务;它们与任何特定实例无关。因此,任何实例都可以向任何客户端发送消息。

  1. 您需要以某种可查询的方式将客户端的通道令牌存储在数据存储中以匹配您的规则。
  2. 您的客户端发出 HTTP 请求以向您的服务器发送消息。
  3. 服务器上的处理程序查询它需要将消息传播到(来自内存缓存或数据存储)的通道令牌。
  4. 服务器上的处理程序向所有客户端发送消息。

如果目标客户端列表非常大,您可能希望在任务队列中执行步骤 3/4,以便操作可以运行更长时间。

于 2013-02-21T17:37:00.150 回答
0

客户端连接到哪个实例并不重要,API 对您隐藏了这一点。

客户端只能通过标准 HTTP 命令“回复”消息,他们实际上没有任何方式直接通过通道 API 进行响应。

因此,服务器 A1 上的客户端 A 想要向服务器 B1 上的客户端 B 发送消息。

客户端 A 发布到处理程序。那可能是实例 A1 或 B1。无论服务器客户端 B 通过 Channel API 连接到哪个服务器,现在服务器将消息传递给客户端 B 都无关紧要。

真正的一点是,一般来说,没有任何 App Engine 实例有任何数据。因此,您连接到哪个实例并不重要,它可能是第 99 个实例或第一个启动的实例。因此,您必须设计您的应用程序,使其与正在使用的实例无关。

  1. 客户端通过 HTTP 向服务器发送消息。

  2. 服务器通过通道 API 向 N 个客户端发送消息。

于 2013-02-21T17:34:43.207 回答
0

通道 API 不会建立固定的前端实例到客户端连接。如果知道通道 ID,任何前端实例都可以将消息推送到通道。

您需要做的是跨渠道传递消息。

  1. 用户一正常向服务器发送消息(例如通过 GET)
  2. 服务器查找第二个用户的频道 ID 并推送消息
  3. 在另一个方向重复过程:第二个用户到第一个用户。
于 2013-02-21T18:00:07.550 回答