如何使用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、持久性和处理隔离和可扩展。
总结起来,信息流是这样的:
- 客户端正在向 websocket 服务器容器发送大量操作
- websocket 服务器只是将它们发送到消息层
- 处理容器(也可以调用!)接收这些消息,处理它们,保存到数据库 and/or 到缓存并最终将更多消息发送到其他主题
- (可选)websocket 服务器接收这些消息并将它们发送给客户端。
或者像这样:
- 客户端请求信息或 websocket 服务器定期需要发送世界状态给客户端
- websocket 服务器查找缓存中的信息
- 并将其发送给客户。
甚至像这样:
- 一些处理服务器独立于消息,它们只是周期性地读取game/world状态(从缓存?)
- 他们处理游戏的物理和机制
- 并将结果保存回缓存中,由websocket服务器定期发送给客户端,或者在主题中发送,以便websocket服务器可以监听并发送给客户端。
最后,不要忘记一机对一的建议game/world。如果每个处理服务器(或服务器的每个线程)都与一个 game/world 一起工作,那就太好了。这将使在不需要同步内容的情况下更容易持久化内容。
如果用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、持久性和处理隔离和可扩展。
总结起来,信息流是这样的:
- 客户端正在向 websocket 服务器容器发送大量操作
- websocket 服务器只是将它们发送到消息层
- 处理容器(也可以调用!)接收这些消息,处理它们,保存到数据库 and/or 到缓存并最终将更多消息发送到其他主题
- (可选)websocket 服务器接收这些消息并将它们发送给客户端。
或者像这样:
- 客户端请求信息或 websocket 服务器定期需要发送世界状态给客户端
- websocket 服务器查找缓存中的信息
- 并将其发送给客户。
甚至像这样:
- 一些处理服务器独立于消息,它们只是周期性地读取game/world状态(从缓存?)
- 他们处理游戏的物理和机制
- 并将结果保存回缓存中,由websocket服务器定期发送给客户端,或者在主题中发送,以便websocket服务器可以监听并发送给客户端。
最后,不要忘记一机对一的建议game/world。如果每个处理服务器(或服务器的每个线程)都与一个 game/world 一起工作,那就太好了。这将使在不需要同步内容的情况下更容易持久化内容。