2017-09-26 9 views
1

저는 Akka (특히 원격 및 클러스터 패키지)를 사용하여 오픈 소스 분산 경제 시뮬레이션 플랫폼을 구축하고 있습니다. 이러한 시뮬레이션에서 주요 병목은 배우 사이의 통신 패턴이 시뮬레이션 과정에서 진화하고 종종 배우가 클러스터의 노드간에 유선을 통해 많은 양의 메시지를 전송하게된다는 사실입니다.Akka 클러스터 샤딩 : 통신 패턴을 기반으로 움직이는 액트 파편

일부 노드의 액터를 다른 노드의 액터와 많이 통신하고있는 액터를 감지하여 다른 노드로 이동시키는 메커니즘을 찾고 있습니다. 기존 Akka 클러스터 샤딩 기능을 사용하여이 작업을 수행 할 수 있습니까? 아마도 이것은 Roland Kuhn이 "자동 액터 트리 파티셔닝"을 의미하는 것이고 this에 대한 그의 대답입니다.

답변

0

사용자 정의 ShardAllocationStrategy을 구현하여 자신의 논리에 따라 샤드를 이동할 수 있습니다.

당신은 그 두 방법을 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]] 

첫 번째는 새로운 파편을 할당 할 때 선택 될 영역을 결정하고, 당신에게 이미 할당 된 파편을 제공합니다. 두 번째 것은 정기적으로 호출되며 다른 지역으로 균형을 조정할 샤드를 제어 할 수 있습니다 (예 : 너무 균형이 맞지 않은 경우).

두 함수 모두 Future를 반환합니다. 즉, 다른 액터를 쿼리하여 필요한 정보 (예 : 액터 간의 유사도 정보가있는 액터)를 얻을 수도 있습니다.

친 화성 그 자체에 대해, 나는 당신이 뭔가를 직접 구현해야한다고 생각합니다. 예를 들어, 액터는 센더 노드에 대한 통계를 수집하고, 액터가 동일한 노드로 이동해야 하는지를 결정하는 클러스터 싱글 톤에 주기적으로 게시 할 수 있습니다.