仅供讨论,
我当时认为AKKA非常适合编写分布式系统,但是如果您的Supervisor和Actors都在一台机器上,那么您的分布式系统将不具备高可用性。如果机器发生故障,整个分布式系统就会崩溃。
那么我如何将Supervisor放在一台机器上,将所有Actors放在不同的机器上。因此,如果一个演员去世,还有其他人要处理这项工作。如果我带来一台替代机器。主管怎么知道有这台新机器可以容纳一个新的演员呢?
最终,Supervisor树会导致Root Supervisor。如果Root Supervisor的机器死了怎么办?这是否使其成为整个分布式系统中最薄弱的环节?如何有一个可以故障转移到的其他Root Supervisor节点?如何在所有Root Supervisor前面安装多个负载均衡器以分配负载?
答案 0 :(得分:0)
首先,有一些关于在多台机器上分配Actor系统,通过网络进行通信的一般主题的文档:
http://doc.akka.io/docs/akka/snapshot/scala/index-network.html
尽管如此,虽然可以远程监督一个演员,但你正确地推测它不会产生太大的额外弹性。相反,使用Cluster Sharding确保工作人员的副本存在于多台计算机上,并使用简单的群集感知ActorRef
从另一台计算机向他们发送消息(没有监督关系)。
答案 1 :(得分:0)
一些问题再次出现,并通过Akka中的各种群集工具解决,这些工具都建立在核心群集API之上。
群集单例允许您在整个群集中拥有一个actor的单个实例,如果该节点被删除,则单个actor将在新节点上启动。请参阅此处的文档:http://doc.akka.io/docs/akka/current/scala/cluster-singleton.html#cluster-singleton
正如László所提到的那样,Sharding是指当你有大量的演员想要维持集群中的一个时。文件在这里: http://doc.akka.io/docs/akka/current/scala/cluster-sharding.html
这两者很好地与Akka Persistence结合在一起,使演员与另一个节点上的前一个演员实例达到相同的状态。
如果您希望演员随时可用,则无法在“只有一个”的情况下实现这一点(基本上是一致性与可用性问题),但您可以使用Akka分布式数据始终可用但最终一致的状态。 http://doc.akka.io/docs/akka/current/scala/distributed-data.html
当然,你也可以使用Actors和Cluster API构建自己的工具,如果现有的工具都不适合你的用例(我不会说这很简单;)。)。