我想在 App Engine 上开发的游戏中实现一个聊天系统。为了实现这一点,我想使用 WebSockets,并让客户端通过集线器相互连接,在本例中是 GCE 的一个实例。假设这个游戏需要扩展到 GCE 上的多个实例,这将如何运作?如果我有一个客户端 1,并且负载均衡器将客户端 1 的请求定向到实例 A,并且另一个客户端 (2) 进来并被定向到实例 B,但是这些客户端想互相聊天,他们每个人都会连接到不同的集线器,并且将无法相互访问。这将如何设置以适应规模?我是否会使用队列来实现它,其中每个实例都在该队列上监听,如果是这样,我将如何实现?
最佳答案
Google Play Game Services提供您想要的功能,但与 Android 和 ios 客户端有关。因此,此选项可能与您的游戏技术设计不兼容。
总的来说,您的推理是正确的。来自想要相互交谈的客户端的消息大多数时候会到达不同的服务器实例。您要做的是让实例处理用户之间的通信。 Pub/sub (publish-subscribe pattern)在这种情况下是非常合适的模式。大致:
- 只要有消息指向客户端 X,就会在 channel X 上发布消息,
- 每当客户端 X 创建 session 时,处理它的实例都会订阅 channel X。
您可以使用众多现有解决方案中的一种作为初学者。使用 redis 进行设置非常容易.如果您需要更底层和更灵活的东西,请查看 zeromq .
您可以期望任一解决方案的单个实例都能够处理数千个 QPS。
很遗憾,我没有任何扩展这两种解决方案的经验,因此无法就它们的可扩展性限制向您提供任何实用建议。
附言。您可能还想探索其他主题,例如:消息持久性和故障恢复我根本没有在这里讨论。
关于google-app-engine - 在 Google Compute Engine 上扩展 WebSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452066/