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

kubernetes在这种情况下是否有任何好的功能?

最佳答案

ThatBrianDude已经给出了一个了不起的答案,而我的回答不会那么好。但是我认为your last comment给了我们关于您所考虑的体系结构的更多提示。我希望我的谦虚答案能为您的游戏带来更多创意。这里有一些建议:

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



因此,为什么不使用缓存和消息传递层来帮助您呢?想象以下示例:

情况1:如果客户端将操作发送到websocket服务器,则服务器应将其放入队列/主题(其他一些服务稍后会对其进行处理)。

情况2:服务器可能还会侦听某些邮件主题,并将其发送回需要该信息的客户端。

情况3:当客户端要求信息或websocket服务器是否需要一些信息发送给客户端时,服务器必须从缓存中读取信息,因为从多人游戏中读取数据库可能很慢。

情况4:最终一个集装箱被杀死。连接到该服务器的客户端将收到连接错误,并应重新连接。这意味着要进行另一次握手,并且玩家可能会感觉到这种握手,具体取决于游戏正在执行的操作,因此,杀死容器不应该经常发生。就是这样,不会丢失任何信息。

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

总结起来,信息将像这样流动:

  • 客户端正在使用
  • Action 为websocket服务器容器添加数据
  • Websocket服务器仅将它们发送到消息传递层
  • 处理容器(也可以称为!)接收那些消息,对其进行处理,保存到数据库和/或缓存中,并最终将更多消息发送给其他主题
  • (可选)websocket服务器接收这些消息并将其发送给客户端。

  • 或像这样:
  • 客户端询问信息或Websocket服务器需要定期向客户端发送世界状态
  • Websocket服务器在缓存
  • 中查找信息
  • 并将其发送给客户端。

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

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

    关于docker - 如何使用Kubernetes与Websocket进行多人在线游戏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46952537/

    10-16 07:22