2017-09-26 87 views
1

我正在使用Akka(特別是遠程和集羣軟件包)構建一個開源分佈式經濟仿真平臺。這種仿真中的一個關鍵瓶頸是,參與者之間的通信模式在仿真過程中演變,並且通常參與者最終會通過羣集中節點之間的線路發送大量消息。Akka cluster-sharding:根據通信模式移動actor碎片

我正在尋找一種機制來檢測某些節點上正在與某些其他節點上的actor進行大量通信並將它們移動到該另一個節點的actor。這可能使用現有的Akka集羣分片功能嗎?也許這是什麼Roland Kuhn意思是「自動演員樹分區」是他對this SO問題的回答。

回答

0

根據自己的邏輯移動碎片可以通過實現自定義ShardAllocationStrategy來實現。

你只需要擴展ShardAllocationStrategy和執行這些2種方法:

def allocateShard(requester: ActorRef, shardId: ShardId, 
    currentShardAllocations: Map[ActorRef, immutable.IndexedSeq[ShardId]]) 
    : Future[ActorRef] 

def rebalance(currentShardAllocations: Map[ActorRef, 
    immutable.IndexedSeq[ShardId]], rebalanceInProgress: Set[ShardId]) 
    : Future[Set[ShardId]] 

第一個決定哪些區域將分配一個新片段時選擇,併爲您提供已分配的碎片。第二個是定期調用的,並允許您控制哪些碎片重新平衡到另一個區域(例如,如果它們變得太不平衡)。

這兩個函數都會返回一個Future,這意味着您甚至可以查詢另一個actor來獲取所需的信息(例如,具有您的actor之間的親和力信息的actor)。

對於親和力本身,我認爲你必須自己實現一些東西。例如,參與者可以收集有關其發件人節點的統計信息,並定期將其發佈到集羣單例中,以確定哪些參與者應該移動到同一個節點。