如果用websocket开发一个在线实时游戏,多人运行在不同的容器上,那么在添加或减少容器时,如何同步数据?
库伯内特斯在这个案子上有什么好的特点吗?
发布于 2018-01-05 02:29:26
ThatBrianDude已经给出了一个很棒的答案,而我的答案也不会那么好。但是,我认为你最后的评论给了我们更多关于您心目中的体系结构的提示。我希望我谦逊的回答能为你的游戏提供更多的想法。以下是一些建议:
首先,避免在websocket应用程序中保留任何状态。
容器的基本思想是它们应该是无状态的。ThatBrianDude
那么,为什么不使用缓存和消息传递层来帮助您做到这一点呢?想象一下以下例子:
情境1:如果客户端向websocket服务器发送一个操作,服务器应该将其放到一个队列/主题中(其他一些服务稍后会处理它)。
情景2:服务器还可能侦听某些类型的消息的主题,并将它们发送回需要该信息的客户端。
情况3:当客户端请求信息或websocket服务器需要一些信息发送到客户端时,服务器必须从缓存中读取信息,因为从DB读取数据对于多人游戏来说可能比较慢。
情况4:最终一个容器被杀死。连接到该服务器的客户端将收到连接错误,并应重新连接。这意味着另一次握手,玩家可能会感觉到,这取决于游戏所做的,所以杀死一个容器不应该经常发生。但仅此而已,任何信息都不会丢失。
这样,websocket服务器容器是完全无状态的,消息传递主题和缓存将帮助您:向容器提供所需的所有信息,并保持websocket、持久性和处理隔离和可伸缩。
总之,这些信息会像这样流动:
或者像这样:
甚至像这样:
最后,不要忘记让一台机器负责一个游戏/世界的建议。如果每个处理服务器(或服务器的每个线程)都能处理一个游戏/世界,那就太好了。这将使不需要同步的东西更容易持久化。
发布于 2017-10-26 11:04:52
容器的基本思想是它们应该是无状态的。
这意味着游戏中可能存在的任何持续数据(高分等)。必须将其保存到持久的DB中,而其他临时数据,如当前的ingame、得分或昵称等,可以留在容器的内存中,并且在容器死后消失。
如何同步数据时,添加或减少容器,如果他们正在播放?
这听起来像是你想要使用多个容器计算一个游戏世界?
这是另一个完全不同的东西,但是你可能想看看SpatialOS,它可以容纳大量的多人世界,并且是为每个世界需要多台机器的游戏而设计的。
如果这不是你要寻找的,我建议你让一台机器负责一个游戏/世界,因为你将避免高复杂性,当你试图同步的东西以后。
https://stackoverflow.com/questions/46952537
复制相似问题