我正在研究我的 bc 论文项目,它应该是一个用 scala 和 Akka 编写的 Minecraft 服务器。服务器应该可以轻松地部署在云中或集群上(不确定我是否使用了正确的术语......它应该在多个节点上运行)。但是,我是akka的新手,我一直想知道如何实现这样的事情。我现在要解决的问题是如何在不同节点上的参与者之间共享状态。我的第一个想法是让 Camel actor 从 minecraft 客户端读取 tcp 流,然后将其发送到负载均衡器,负载均衡器将选择一个处理请求的节点,然后通过 tcp 向客户端发送一些响应。假设我有一个 AuthenticationService 实现参与者,它检查用户提供的凭据是否有效。每个节点都会有这样的参与者(或者可能更多),并且所有参与者都应该始终拥有完全相同的用户数据库(或状态)。我的问题是,保持这种状态的最佳方法是什么?我想出了一些我能想到的解决方案,但我还没有做过这样的事情,所以请指出错误:
解决方案#1:将状态保存在数据库中。这对于这个身份验证示例可能非常有效,其中状态仅由用户名和密码列表表示,但在状态包含不能轻易分解为整数和字符串的对象的情况下,它可能不起作用。
解决方案#2:每次对某个参与者的请求会改变其状态时,该参与者将在处理该请求后,将有关更改的信息广播给所有其他相同类型的参与者,这些参与者将根据原始演员发送的信息。这似乎非常低效且相当笨拙。
解决方案#3:让某个节点充当某种状态节点,其中会有代表整个服务器状态的参与者。除了此类节点中的参与者之外,任何其他参与者都没有状态,并且每次需要一些数据时都会询问“状态节点”中的参与者。这似乎也效率低下,而且有点防错。
所以你有它。我真正喜欢的唯一解决方案是第一个,但就像我说的那样,它可能只适用于非常有限的问题子集(当状态可以分解为 redis 结构时)。更有经验的大师的任何回应都会非常感激。问候,托马斯·赫尔曼