簡體   English   中英

使用Akka.NET在集群中為每個用戶實現一個參與者(子實體模式)

[英]Implement one actor per user (Child-Per-Entity pattern) in a cluster using Akka.NET

我正在做一些示例以了解有關Akka.NET的知識。 我正在嘗試實現“每個實體的孩子”模式(如Akka.NET設計模式所示 ),其中每個用戶(在整個集群中)每個角色都有一個參與者

為此,我嘗試使用帶有ConsistentHashingPool的ClusterRouterPool,該消息將消息分發給一些父角色,該父角色保留IDictionary(int,IActorRef)並通過其ID索引子角色(用作一致性哈希的鍵)。

但是,這種方法似乎並不像我最初預期的那樣起作用,因為:

  1. 讓不同的客戶端創建路由器將導致他們創建多個父角色,進而創建重復的子角色。
  2. 即使我只有一個路由器,如果有新節點加入集群,會發生什么? 路由器是否會自行重新平衡,導致路由再次路由到新的父角色,從而創建重復的子角色?

在StackOverflow上有一個類似的問題 ,它指向使用Akka.Cluster.Sharding,但是在Akka.NET設計模式上, Aaron發表了一條評論,指出他使用了一致的哈希路由器方法,因此為什么我首先開始使用它。

謝謝

我認為,這個關鍵概念是要了解Akka.Cluster.Sharding和一致的哈希路由器之間的區別:

  • Akka.Cluster.Sharding中,消息執行者路由基於(ShardId,EntityId)標識符。 這是一對一的關系,這意味着具有不同標識符的消息將始終被路由到其專用參與者。 此外,集群分片將確保即使集群中的節點數將發生更改,消息也會正確發送給其參與者。
  • 一致的哈希路由器方法中,重要的要理解的是密鑰空間的概念-它是要接收的所有可能的消息標識符的空間。 然后,將這個空間除以路由器后面的actor數量-這意味着每個actor都不與單個標識符關聯,而是與它的范圍關聯。 這是一對多關系,因此可能會將具有不同ID的兩條消息路由到同一參與者。 此外,隨着群集中節點數的變化,該路由器后面的actor的數量也會發生變化-結果,actor的密鑰范圍不是固定的,並且可能會隨時間變化。 這意味着,當群集大小更改時,具有相同標識符的消息可能會被路由到其他參與者。

因此,我認為您正在尋找集群分片。 在Akka.NET核心存儲庫的“示例”部分中,您可能會找到一個直接解決您的案例的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM