2017-09-14 10 views
0

Imaginez que vous avez un service qui retourne évaluations restaurant dans quatre capitales européennes:Sharding par le trafic avec des acteurs Akka

  • Amsterdam
  • Dublin
  • Londres
  • Paris

En utilisant Akka , imaginez que vous assignez chaque ville à un acteur, puis divisez ces acteurs entre deux nœuds (pensez à Akka Cluster). Si nous Shard naïvement nos acteurs par ordre alphabétique, la division résultant est:

  • Noeud 1: acteurs Amsterdam + Dublin (population totale de 4 millions)
  • Node 2: Londres + acteurs Paris (total population 11 millions)

De toute évidence, le trafic sera très déséquilibré. Si vous ne connaissez pas la population des villes à l'avance, Akka fournit-il un outil pour reconfigurer dynamiquement la façon dont vous partitionnez ces villes?

J'apprécie n'importe quel pointeur ou référence. Merci de votre aide!

+0

Je pense qu'ils fournissent une sorte de sélection d'acteurs pour l'équilibrage de charge 'round robin' – Erix

+0

Je lis des parties du livre [Applied Akka Patterns] (http://shop.oreilly.com/product/0636920043577.do) , va poster ici quand je trouve quelque chose! – ticofab

Répondre

1

Comme vous l'avez mentionné, Cluster Sharding vous permet de distribuer facilement vos acteurs à travers le cluster. Par défaut, un nouveau fragment est créé sur la région (nœud) avec le moins de fragments alloués (LeastShardAllocationStrategy), mais vous pouvez facilement créer votre propre ShardAllocationStrategy personnalisé avec des règles différentes.

Pour ce faire, é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 fragments à rééquilibrer dans une autre région (par exemple, s'ils sont trop déséquilibrés). Les deux fonctions renvoient un Future, ce qui signifie que vous pouvez même interroger un autre acteur pour obtenir l'information dont vous avez besoin (dans votre cas, par exemple, prenez le "poids" de chaque ville pour choisir la région avec le plus petit poids) .

+0

Merci @Pierre! – ticofab