Arg*_*Arg 8 scala cluster-computing actor akka akka-cluster
我正在研究我的bc论文项目,该项目应该是用scala和Akka编写的Minecraft服务器.服务器应该可以轻松地部署在云中或集群上(不确定我是否使用正确的术语......它应该在多个节点上运行).然而,我是akka的新手,我一直想知道如何实现这样的事情.我现在想弄清楚的问题是如何在不同节点上的演员之间共享状态.我的第一个想法是有一个骆驼演员会从我的世界客户端读取TCP流,然后将其发送到负载平衡器这将选择将处理请求,然后发送通过TCP给客户一些响应的节点.假设我有一个AuthenticationService实现actor,它检查用户提供的凭据是否有效.每个节点都有这样的actor(或者可能更多),并且所有actor都应该始终拥有完全相同的用户数据库(或状态).我的问题是,保持这种状态的最佳方法是什么?我想出了一些我能想到的解决方案,但我没有做过这样的事情,所以请指出错误:
解决方案#1:将状态保存在数据库中.这可能会很好地工作,其中状态仅由类似的用户名和密码列表来表示该认证的例子,但它可能在那里状态包含对象不容易被分解成整数和字符串不会在情况下工作.
解决方案2:每次会有一定男主角会改变它的状态,要求演员会,处理请求有关的变化相同类型的所有其他行动人将改变根据自己的状态,广播信息后原始演员发送的信息.这看起来非常低效而且相当笨拙.
解决方案#3:让某个节点充当一个状态节点,其中会有代表整个服务器状态的actor.除了这样的节点中的actor之外的任何其他actor都没有状态,并且每次他们需要一些数据时都会询问"状态节点"中的actor.这似乎也是低效的,有点不容错误.
所以你有它.只有我真正喜欢的解决方案才是第一个,但就像我说的那样,它可能仅适用于非常有限的问题子集(当状态可以分解为redis结构时).来自更有经验的大师的任何回应都会非常受欢迎.此致,托马斯赫尔曼
解决方案#1 可能会很慢。此外,它还是一个瓶颈和单点故障(意味着如果具有数据库的节点发生故障,应用程序将停止工作)。解决方案#3 也有类似的问题。
\n\n解决方案#2 并不像看起来那么简单。首先,它是单点故障。其次,读取或写入没有原子性或其他排序保证(例如规律性),除非您进行全序广播(这比常规广播更昂贵)。事实上,大多数分布式寄存器算法都会在幕后进行广播,因此,虽然效率低下,但可能是必要的。
\n\n根据您的描述,您的分布式寄存器需要原子性。原子性是什么意思?原子性意味着并发读取和写入序列中的任何读取或写入看起来就像发生在单个时间点一样。\n非正式地,在解决方案 #2 中,单个参与者持有寄存器,这保证了如果 2 个后续写入发生 W1 然后 W2 到寄存器(意味着 2 次广播),然后从寄存器读取值的其他参与者不会以与先 W1 然后 W2 不同的顺序读取它们(实际上比这更复杂)。如果您查看几个消息在不同时间点到达目的地的后续广播示例,您将发现根本无法保证这样的排序属性。
\n\n如果排序保证或原子性不是问题,某种基于八卦的算法可能会慢慢地将更改传播到所有节点。这对于您的示例可能没有多大帮助。
\n\n如果你想要完全的容错和原子性,我建议你阅读Rachid Guerraoui 和 Lu\xc3\xads Rodrigues 写的关于可靠分布式编程的书,或者与分布式寄存器抽象相关的部分。这些算法构建在消息传递通信层之上,并维护支持读写操作的分布式寄存器。您可以使用这样的算法来存储分布式状态信息。但是,它们不适用于数千个节点或大型集群,因为它们无法扩展,通常具有节点数量的复杂性多项式。
\n\n另一方面,您可能不需要在所有节点之间复制分布式寄存器的状态 - 将其复制到节点的子集(而不是仅一个节点)并访问这些节点以从中读取或写入,提供一定程度的容错能力(只有当整个节点子集出现故障时,寄存器信息才会丢失)。您可以调整书中的算法来实现此目的。
\n| 归档时间: |
|
| 查看次数: |
2810 次 |
| 最近记录: |