2017-04-25 1 views
0

J'ai deux systèmes d'acteur qui communiquent via akka remoting.SelectChildName messages de RemoteDeadLetterActorRef

Lorsque je regarde le tas JVM, je vois (trop) beaucoup d'instances de akka.dispatch.Envelope contenant SelectChildName messages de akka.remote.RemoteActorRefProvider$RemoteDeadLetterActorRef.

Le tas conservé de ces messages est assez volumineux et provoque des problèmes de mémoire.

Quel est le but de ces messages SelectChildName? Y a-t-il un moyen de les éviter?

FYI Cela semble se rapporter aux erreurs de dissociation qui se produisent entre les deux systèmes d'acteur.

Merci, Michail

Répondre

1

SelectChildName messages sont utilisés par Akka Remoting pour résoudre un acteur à distance. Si vous en voyez beaucoup, il y a une chance que vous interagissiez directement avec un ActorSelection, au lieu d'un ActorRef.

Chaque fois que vous envoyez un message à un ActorSelection, par exemple (ceux-ci proviennent de la docs)

val selection = context.actorSelection("akka.tcp://[email protected]:2552/user/actorName") 
selection ! "Pretty awesome feature" 

le - peut-être à distance - acteur est résolu, et qui consiste à échanger des SelectChildName messages par le sous-jacent Akka infrastructure. Si cela est le cas, essayez et utilisez directement ActorRef s. Vous pouvez en obtenir un à partir d'un ActorSelection en utilisant la méthode resolveOne.

Citant le docs nouveau:

Il est toujours préférable de communiquer avec d'autres acteurs utilisant leur ActorRef au lieu de compter sur ActorSelection. Des exceptions sont

  • envoyaient des messages en utilisant le moins At-Once installation de livraison
  • initier le premier contact avec un système distant