2016-12-16 2 views
2

Voici mon cas d'utilisation:Akka Balancing Pool avec de taille variable fil-Pool-Exécuteur

Je veux créer un routeur d'équilibrage-Pool de taille x (x est le nombre d'instances/routées qui est déterminée à runtime) avec chacun des routines ayant son propre thread dédié. Chacun des routages est censé effectuer des opérations de blocage.

La documentation Akka explique que vous ne pouvez pas modifier le répartiteur d'un pool d'équilibrage. Ce qui élimine l'option d'utiliser un répartiteur épinglé (qui ferait exactement ce dont j'ai besoin, un pool de threads de taille 1 par routee).

De Akka documentation:

Le BalancingPool utilise automatiquement un BalancingDispatcher spécial pour ses routées - abstraction faite de toute dispatcher qui est situé sur l'objet routée Props. Ceci est nécessaire pour implémenter la sémantique d'équilibrage en partageant la même boîte aux lettres par tous les routages.

S'il n'est pas possible de modifier le répartiteur utilisé par les routes, il est possible d'affiner l'exécuteur utilisé. Par défaut, le fourchette-join-répartiteur est utilisé et peut être configuré comme expliqué dans Dispatchers [AJ: Je crois que c'est une faute de frappe et ils dire fourche join-exécuteur testamentaire]. Dans les situations où les routées sont censés effectuer des opérations de blocage, il peut être utile de le remplacer par un fil-pool-exécuteur testamentaire laissant entendre le nombre de threads alloués explicitement

exemple de configuration de Akka docs ainsi:

akka.actor.deployment { 
    /parent/router10b { 
    router = balancing-pool 
    nr-of-instances = 5 
    pool-dispatcher { 
     executor = "thread-pool-executor" 

     # allocate exactly 5 threads for this pool 
     thread-pool-executor { 
     core-pool-size-min = 5 
     core-pool-size-max = 5 
     } 
    } 
    } 
} 

Il semble que l'exécuteur de pool de threads avec une taille de pool correspondant au nombre d'itinéraires fonctionnerait, mais voici le problème: Comment dynamiquement (lors de l'exécution) définir la taille du pool de mon exécuteur de pool de threads des routes si la taille du pool doit être définie explicitement dans la configuration?

Aussi, est-il possible de créer le Balancing-Pool (en code) tout en tirant l'exécuteur de ses routes de config? -à-dire que je ne veux pas utiliser la config pour définir mon routeur, je veux utiliser:

val myRouter = BalancingPool(x).props(Props[Worker])...) 

mais préciser en quelque sorte qui exécuteur à utiliser (de config), en utilisant le même style de withMailbox() ou withDispatcher (

Depuis le Balancing Dispatcher is "Driven by: java.util.concurrent.ExecutorService", est-il possible de créer un ExecutorService et de le transmettre au routeur du pool d'équilibrage ou à son répartiteur?

Répondre

0

Peut-être quelque chose comme ceci:

val bp = BalancingPool(instances, routerDispatcher = "pinned-dispatcher") 
val myRouter = context.actorOf(Props...) 
    .withRouter(bp), 
    name = "myRouter")