2014-01-24 30 views

回答

2

解释Akka集群如何工作将会很长,但我可以尝试给出一个概述。

在Akka设置的会员资格本质上是一个高度专业化的CRDT。由于谈论矢量时钟本身将是一个漫长的讨论,我将使用类似git的存储库。

您可以想象每个Akka节点都维护自己的存储库,其中HEAD指向群集的当前状态(该节点已知)。当一个节点引入一个变化时,它会分支出去,并开始将变化传播到其他节点(这部分或多或少是随机的)。

有一些变化,我们称之为单调这在git比喻中意味着分支可以平分合并。这些更改只是在接收到其他节点时才会合并,然后他们会将合并提交传播给其他人,最终所有内容都会稳定下来(HEAD指向相同的内容)。 (非单调)。这个过程就是节点首先发送一个建议:“我想做这个不重要的变化C”。这是必要的,因为其他节点需要知道这个未决的“复杂”变化并准备好自己。这是在节点之间传播,直到每个人都收到它。现在我们处于“每个人都知道有人提出做出改变C”的状态,但这还不够,因为没有人真正意识到还有协议。

因此存在另一个“轮”,其中节点开始传播信息“I,节点Y,意识到已经提出改变C的事实”。最终,一个或多个节点意识到存在协议(这或多或少是分布式确认协议)。所以现在的状态是“至少有一个节点知道每个节点都知道改变C已经被提出”。这是(部分)我们称之为汇合。此时,知道该协议的节点(或多个节点)将进行合并并将其传播。

请注意,我高度简化的解释在这里,显然是魔鬼(和缩放)在细节:)

+0

如何将节点分散的环境意识到其他节点?我认为他们必须意识到他们正在与之通信的节点。在一个集中的环境中,我会想象节点向“中心”查询随机节点“地址”,然后用它来发送消息。这是如何在分散的集群中发生的? –

+0

种子节点+八卦。请阅读http://doc.akka.io/docs/akka/snapshot/common/cluster.html。 – sourcedelica