独自のロジックに従ってシャードを移動するには、カスタムShardAllocationStrategy
を実装します。
あなただけのこれらの2つの方法をShardAllocationStrategyを拡張して実装する必要があります。
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]]
最初のものは新しいシャードを割り当てる際に選択されますどの領域を決定し、あなたにすでに割り当てられ破片を提供します。 2番目は定期的に呼び出され、どのシャードを別の地域に再調整するかを制御できます(たとえば、あまりにもバランスがとれていない場合など)。
どちらの関数もFutureを返します。つまり、必要な情報(たとえば、アクター間の親和性情報を持つアクター)を取得するために別のアクターを照会することもできます。
アフィニティ自体については、自分で何かを実装する必要があると思います。たとえば、アクターは送信者ノードに関する統計を収集し、それを定期的にクラスターシングルトンに送信して、どのアクターを同じノードに移動すべきかを決定することができます。