2017-04-25 83 views
0

我有两个通过akka远程通信的角色系统。来自RemoteDeadLetterActorRef的SelectChildName消息

当我看看JVM堆时,我看到(太)akka.dispatch.Envelope的许多实例包含来自akka.remote.RemoteActorRefProvider$RemoteDeadLetterActorRefSelectChildName消息。

这些消息的保留堆非常大,并导致内存问题。

这些SelectChildName消息的目的是什么?有没有办法避免它们?

仅供参考这似乎与两个参与者系统之间发生的分离错误有关。

感谢, 米凯尔

回答

1

SelectChildName消息由阿卡远程处理解决远程演员。如果您看到其中很多,则可能会直接与ActorSelection而不是ActorRef进行互动。

每次发送消息给一个ActorSelection,例如(这些是从docs截取)

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

的 - 可能远程 - 演员得到解决,并涉及由底层交换SelectChildName消息的阿卡基础设施。

如果是这种情况,请尝试直接使用ActorRef s。您可以使用resolveOne方法从ActorSelection中获得一个。

引述docs再次:

它始终是优选使用 其ActorRef而不是依靠ActorSelection其他行动者进行通信。例外

  • 使用与远程系统
对AT-最不一旦交货设施
  • 发起第一接触发送消息