在Google Compute Engine上扩展WebSockets

时间:2013-08-26 19:59:38

标签: google-app-engine websocket google-compute-engine

我想实现一个聊天系统,作为我在App Engine上开发的游戏的一部分。为了实现这一点,我想使用WebSockets,让客户端通过集线器相互连接,在这种情况下是GCE的一个实例。假设这个游戏需要扩展到GCE上的多个实例,这将如何工作?如果我有一个客户端1,并且负载均衡器将客户端1的请求定向到实例A,而另一个客户端(2)进入并被定向到实例B,但是那些客户端想要彼此聊天,他们每个都是连接到不同的集线器,并且无法相互联系。如何设置与规模一起工作?我会使用队列来实现它,其中每个实例都在侦听该队列,如果是,我该怎么做?

2 个答案:

答案 0 :(得分:2)

Google Play Game Services提供了您想要的功能,但针对Android和ios客户端。因此,此选项可能与您的游戏技术设计不兼容。

一般来说,你的推理是正确的。来自客户端的想要彼此交谈的消息大部分时间都会遇到不同的服务器实例。您要做的是使实例处理用户之间的通信。在这种情况下,Pub/sub (publish-subscribe pattern)是非常合适的模式。大致是:

  • 只要有指向客户端X的消息,就会在通道X上发布消息
  • 每当客户端X创建会话时,处理它的实例都会订阅通道X。

您可以使用众多现有解决方案中的一种作为初学者。使用redis进行设置非常容易。如果您需要更低级别且更灵活的内容,请查看zeromq

您可以预期任一解决方案的单个实例都能够处理数千个QPS。

不幸的是,我没有任何扩展这些解决方案的经验,因此无法就可扩展性的限制为您提供任何实用建议。

PS。还有其他一些您可能想要探索的主题,例如:消息持久性和故障恢复我根本没有在这里讨论过。

答案 1 :(得分:0)

我还没有尝试实现这个,但我可能很快就会这样做,我认为自己处理它应该相当简单。

你有:服务器1包含客户端列表,你有服务器2和另一个客户端列表, 因此,如果客户端想要将数据发送到可能位于服务器2上的另一个客户端,则必须:

  1. 查看接收者是否在当前服务器上 - 如果是,则只发送(标准)
  2. 否则,您将相同的数据发送到您拥有的所有其他服务器,以便他们检查特定客户端(或客户端)的列表并将数据发送给他们。