我们正在Scala + Akka开发服务器系统,用于为Android,iPhone和Second Fife提供服务的游戏。该服务器的某些部分需要高度可用,可以在多台计算机上运行。如果这些服务器之一死亡(例如硬件故障),则系统需要继续运行。我想我希望客户能够尝试与Cassandra的工作原理类似的机器列表。

到目前为止,我与Akka见过的多节点示例在我看来是围绕可扩展性的想法而不是高可用性(至少在硬件方面)。多节点示例似乎总是具有单点故障。例如,有负载平衡器,但是如果我需要重新启动具有负载平衡器的机器之一,我的系统将遭受一些停机时间。

是否有任何示例显示Akka的这种硬件可容忍度?或者,您对做到这一点的好方法有任何想法吗?

到目前为止,我能想到的最好的答案是研究Erlang OTP文档,冥想它们,并尝试使用Akka中可用的构建块将我的系统放在一起。

但是,如果有关于如何在多台机器之间共享状态的资源,示例或想法,如果其中一个人不断下降,我肯定会感谢它们,因为我担心我可能会重新发明轮子在这里。也许有一个多节点的STM容器可以自动使共享状态保持在多个节点之间的同步?也许这是如此容易,以至于文档不会打扰显示如何做的示例,或者也许我在研究和实验中还不够彻底。任何想法或想法都将受到赞赏。

有帮助吗?

解决方案

HA和负载管理是可伸缩性的非常重要的方面,可以作为一部分 AkkaSource 商业产品。

其他提示

如果您已经列出了客户中的多个潜在主机,那么这些主机可以有效地成为负载平衡器。

您可以提供主机建议服务,并向客户端推荐他们应该连接到的机器(基于当前负载或其他),然后客户可以将其固定在连接失败之前。

如果主机建议服务不存在,则客户端可以简单地从其内部列表中选择一个随机主机,然后尝试它们直到连接为止。

理想情况下,首次启动时,客户端将连接到主机建议服务,不仅可以指向适当的主机,而且还可以列出其他潜在主机的列表。每次客户端连接时,都可以定期更新此列表。

如果主机建议服务在客户端进行第一次尝试(不太可能,但是...),那么您可以在客户端安装中预部主机列表,以便它可以从一开始就可以立即开始随机选择主机,如果它也有。

确保您的主机列表是实际的主机名,而不是IP,它可以长期具有更高的灵活性(即您将“始终” host1.example.com,host2.example.com ...等您移动基础架构并更改IP)。

你可以看一下 Reddwarf 这是叉子 dimdwarf 是建造的。它们都是水平可扩展的仅碰撞游戏应用程序服务器,DIMDWARF部分用Scala(新的消息传递功能)编写。他们的方法和架构应该很好地满足您的需求:)

2美分..

“如何以多台机器之间的方式共享状态,如果其中一个人倒下的事情将继续运行”

不要在机器之间共享状态,而是跨机器分区状态。我不知道您的域名,所以我不知道这是否会起作用。但是,从本质上讲,如果您将某些聚合(以DDD术语)分配给某些节点,则可以在使用时将这些聚合物保留在内存(Actor,Agent等)中。为了做到这一点,您需要使用Zookeeper之类的东西来协调哪些节点处理哪些汇总。如果发生故障,则可以将聚集体放在不同的节点上。

此外,如果您使用事件采购模型来构建汇总,那么通过那些节点聆听事件并维护自己的副本,将汇总的实时副本(奴隶)在其他节点上的汇总几乎是微不足道的。

通过使用akka,我们几乎可以免费在节点之间进行远程远程。这意味着,节点处理可能需要与其他节点上的聚合/实体进行交互的请求可以使用remoteactors进行。

我在这里概述的是非常通用的,但是给出了一种与Akka和Zookeeper分布耐受性的方法。它可能会或可能无济于事。我希望这样做。

最好的安迪

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top