2016-11-18 29 views
0

我正在做一些示例以瞭解一些關於Akka.NET的內容。我試圖實現每個實體的子模式(如Akka.NET Design Patterns所示),其中每個用戶有一個角色(跨羣集)。使用Akka.NET在集羣中爲每個用戶實現一個actor(每個實體的子模式)

要做到這一點,我試圖使用ConsistentHashingPool的一個ClusterRouterPool,它將消息分發給一些父類actor,這些父類actor通過id代表索引的child actors(int,IActorRef)(用作一致性的關鍵字哈希值)。

這種方法卻似乎並沒有工作,當我最初預期,因爲:

  1. 具有不同的客戶創造的路由器,將導致在創建多個父演員,這反過來會造成重複的兒童演員。
  2. 即使我有一臺路由器,如果新節點加入集羣會發生什麼?路由器不會重新平衡自己,從而導致再次創建路由到新的父母角色,從而產生重複的子角色?

有幾分相似question這裏StackOverflow上指向使用Akka.Cluster.Sharding,但Akka.NET Design Patterns亞倫有評論指出,他使用一致性哈希路由器的方法,因此爲什麼我在第一時間啓動它。

感謝

+0

僅供參考,我將示例添加到[GitHub](https://github.com/joaofbantunes/AkkaSample) – joaofbantunes

回答

1

我認爲,關鍵的概念是理解Akka.Cluster.Sharding和一致性哈希路由器之間的區別:

  • Akka.Cluster.Sharding消息演員路由基於(ShardId,EntityId)標識符。這是1對1的關係,這意味着具有不同標識符的消息將始終被路由到他們的專用角色。此外,羣集分片將保證,即使羣集中的節點數量將發生變化,郵件也會正確發送給其參與者。
  • 一致的散列路由器方法重要的是要理解的是關鍵空間的概念 - 它是所有可能的消息標識符的空間接收。然後這個空間除以路由器後面的參與者數量 - 這意味着每個參與者不與一個標識符相關聯,而是與其範圍相關聯。這是一對多的關係,所以有可能兩個具有不同id的消息將被路由到同一個actor。此外,隨着羣集中節點的數量將發生變化,該路由器後面的參與者數量也將發生變化 - 因此,演員的密鑰範圍並不固定,並且可能隨時間而改變。這意味着當羣集大小改變時,具有相同標識符的消息可能被路由到不同的參與者。

因此,我認爲,羣集分片就是你要找的。在Akka.NET核心存儲庫的示例部分中,您可以找到a sample,它可以直接解決您的問題。

+0

謝謝。我確實去過Akka.NET的樣本,但沒有進入Sharding樣本,所以我錯過了你指出的那個樣本。 鑑於Aaron的評論我認爲這將是可行的與一致的哈希路由器(與路由器和實際實體之間的中間父行爲),但也許這只是一個選項,而不是在集羣模式。 – joaofbantunes

相關問題