如何使用Kubernetes通过websocket做多人在线游戏?

How to use Kubernetes to do multiplayer online game with websocket?

如果用websocket开发一个在线实时游戏,多人游戏运行在不同的容器上,如果正在玩,添加或减少容器时如何同步数据?

kubernetes在这种情况下有什么好的功能吗?

容器的基本思想是它们应该是无状态的。

这意味着您的游戏可能拥有的任何持久数据(高分等)都必须保存到持久数据库中,而其他临时数据(例如当前游戏得分或昵称等)可以保留在容器的内存中并消失一旦容器死亡。

how to sync data when add or reduce containers if they are playing?

这听起来像是您想使用多个容器来计算一个游戏世界?

这本身就是另一种野兽,但您可能想看看 SpatialOS,它几乎允许大型多人游戏世界,并且专为每个世界需要多台机器的游戏而设计。

如果这不是您要找的东西,我建议您让一台机器负责一台机器 game/world,因为您可以在稍后尝试同步内容时避免高复杂度。

ThatBrianDude already gave an awesome answer, and mine will not be that good. But I think 给了我们更多关于您心目中架构的提示。我希望我谦虚的回答能为您的游戏带来更多想法。以下是一些建议:

首先,避免在 websocket 应用程序中保留任何状态。

The basic idea with containers is that they should be stateless.

那么,为什么不使用缓存和消息传递层来帮助您呢。设想以下示例:

情况一:如果客户端向websocket服务器发送一个动作,服务器应该把它放在一个queue/topic中(其他服务稍后会处理它)。

情况 2:服务器可能还监听某个(某些)主题的某些类型的消息,并将它们发送回需要该信息的客户端。

情况 3:当客户端请求信息或者 websocket 服务器需要一些信息发送给客户端时,服务器必须从缓存中读取它,因为从 DB 读取对于多人游戏来说可能很慢。

情况四:最终一个容器被杀死。连接到该服务器的客户端将收到连接错误,并且应该重新连接。这意味着另一次握手,玩家可能会感觉到,这取决于游戏在做什么,所以杀死容器不应该经常发生。但仅此而已,不会丢失任何信息。

这样,websocket 服务器容器是完全无状态的,消息传递主题和缓存将帮助您:提供容器所需的所有信息,以及;保持 websockets、持久性和处理隔离和可扩展。

总结起来,信息流是这样的:

  1. 客户端正在向 websocket 服务器容器发送大量操作
  2. websocket 服务器只是将它们发送到消息层
  3. 处理容器(也可以调用!)接收这些消息,处理它们,保存到数据库 and/or 到缓存并最终将更多消息发送到其他主题
  4. (可选)websocket 服务器接收这些消息并将它们发送给客户端。

或者像这样:

  1. 客户端请求信息或 websocket 服务器定期需要发送世界状态给客户端
  2. websocket 服务器查找缓存中的信息
  3. 并将其发送给客户。

甚至像这样:

  1. 一些处理服务器独立于消息,它们只是周期性地读取game/world状态(从缓存?)
  2. 他们处理游戏的物理和机制
  3. 并将结果保存回缓存中,由websocket服务器定期发送给客户端,或者在主题中发送,以便websocket服务器可以监听并发送给客户端。

最后,不要忘记一机对一的建议game/world。如果每个处理服务器(或服务器的每个线程)都与一个 game/world 一起工作,那就太好了。这将使在不需要同步内容的情况下更容易持久化内容。