Docker 如何使用Kubernetes与websocket进行多人在线游戏?

Docker 如何使用Kubernetes与websocket进行多人在线游戏?,docker,websocket,kubernetes,containers,real-time,Docker,Websocket,Kubernetes,Containers,Real Time,如果使用websocket开发在线实时游戏,多人在不同容器上运行,如何在添加或减少容器时同步数据 kubernetes在这种情况下有什么好的特性吗?容器的基本思想是它们应该是无状态的 这意味着您的游戏可能拥有的任何持久性数据(高分等)必须保存到持久性数据库中,而其他临时数据(如当前ingame分数或昵称等)可以保留在容器内存中,并在容器死亡后消失 如果正在播放,如何在添加或减少容器时同步数据 听起来你想用多个容器来计算一个游戏世界 这是一个完全不同的野兽,但你可能想看看,它几乎允许大规模多人世界

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


kubernetes在这种情况下有什么好的特性吗?

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

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

如果正在播放,如何在添加或减少容器时同步数据

听起来你想用多个容器来计算一个游戏世界

这是一个完全不同的野兽,但你可能想看看,它几乎允许大规模多人世界,是为每个世界需要一台以上机器的游戏而设计的

如果这不是你想要的,我建议你让一台机器负责一个游戏/世界,因为你以后尝试同步东西时会避免高复杂性。

已经给出了一个很棒的答案,而我的不会那么好。但我认为这给了我们更多关于你心目中的架构的提示。我希望我谦虚的回答能给你的游戏带来更多的想法。以下是一些建议:

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


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

那么,为什么不使用缓存和消息层来帮助您呢。想象一下下面的例子:

情况1:如果客户端向websocket服务器发送一个操作,服务器应该将其放入队列/主题中(稍后其他服务将处理该操作)

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

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

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

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

总之,信息的流动如下:

  • 客户端正在向websocket服务器容器中发送大量操作
  • websocket服务器只是将它们发送到消息传递层
  • 处理容器(也可以缩放!)接收这些消息,处理它们,保存到数据库和/或缓存,并最终将更多消息发送到其他主题
  • (可选)websocket服务器接收这些消息并将其发送到客户端
  • 或者像这样:

  • 客户端请求信息,或者websocket服务器需要定期向客户端发送世界状态
  • websocket服务器在缓存中查找信息
  • 并发送给客户
  • 甚至像这样:

  • 一些处理服务器独立于消息,它们只是周期性地(从缓存?)读取游戏/世界状态
  • 他们处理游戏的物理和力学
  • 并将结果保存回缓存中,缓存将由websocket服务器定期发送给客户端,或者将其发送到主题中,以便websocket服务器可以侦听并发送给客户端

  • 最后,不要忘记让一台机器负责一个游戏/世界的建议。如果每个处理服务器(或服务器的每个线程)都与一个游戏/世界一起工作,那就太好了。这样可以更轻松地保存内容,而无需同步内容。

    谢谢您的回答。现在,我们想建立一个游戏,分离后端和前端与API。后端易于使用容器部署,数据将保存到数据库。问题是前端使用websocket,他们在游戏结束之前不会连接后端API。因此,如果多个玩家在游戏中玩,当这个容器被更改时,他们的数据还没有从API保存到DB,他们将丢失一些信息。在这种情况下,我想找到一个好办法。对不起,我认为我没有完全理解这个问题。如果您的前端正在使用WebSocket,那么您的后端不也需要它们吗?事实上,我们正在使用两种后端。一个用于将数据保存到数据库,另一个用于玩游戏。但另一个没有直接连接到DB,每次玩完游戏后,它都使用API将数据发送到基本后端服务器。免责声明:我不是游戏开发人员,请注意,这可能会给游戏增加不必要的复杂性或延迟。。。