2017-09-26 9 views
1

Je construis une plate-forme de simulation économique distribuée open-source utilisant Akka (en particulier les paquets distants et cluster). Un goulot d'étranglement clé dans de telles simulations est le fait que les modèles de communication entre les acteurs évoluent au cours de la simulation et que souvent les acteurs finiront par envoyer des charges de messages sur le réseau entre les nœuds du cluster.Akka cluster-sharding: fragments d'acteur en mouvement basés sur des modèles de communication

Je cherche un mécanisme pour détecter les acteurs sur un nœud qui communiquent beaucoup avec les acteurs d'un autre nœud et les déplacent vers cet autre nœud. Est-ce possible en utilisant la fonctionnalité de partitionnement de cluster Akka existante? Peut-être c'est ce que Roland Kuhn signifié par "partitionnement automatique de l'acteur" est sa réponse à this SO question.

Répondre

0

Pour déplacer des fragments autour selon votre propre logique est réalisable en mettant en œuvre un ShardAllocationStrategy personnalisé.

Il vous suffit d'étendre ShardAllocationStrategy et mettre en œuvre ces 2 méthodes:

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]] 

La première détermine quelle région sera choisie lors de l'attribution d'une nouvelle tesson, et vous fournit les tessons déjà attribués. Le second est appelé régulièrement et vous permet de contrôler les partitions à rééquilibrer dans une autre région (par exemple, si elles sont trop déséquilibrées).

Les deux fonctions renvoient un futur, ce qui signifie que vous pouvez même interroger un autre acteur pour obtenir l'information dont vous avez besoin (par exemple, un acteur qui a l'information d'affinité entre vos acteurs). Pour l'affinité elle-même, je pense que vous devez implémenter quelque chose vous-même. Par exemple, les acteurs pourraient collecter des statistiques sur leurs nœuds émetteurs et les publier régulièrement sur un singleton de cluster qui déterminerait quels acteurs devraient être déplacés vers le même nœud.