我有两个通过 akka 远程通信的演员系统。
当我查看 JVM 堆时,我看到(太多)akka.dispatch.Envelope
包含SelectChildName
来自akka.remote.RemoteActorRefProvider$RemoteDeadLetterActorRef
.
这些消息的保留堆非常大,会导致内存问题。
SelectChildName
这些消息的目的是什么?有没有办法避免它们?
仅供参考,这似乎与两个参与者系统之间发生的解除关联错误有关。
谢谢,迈克尔
我有两个通过 akka 远程通信的演员系统。
当我查看 JVM 堆时,我看到(太多)akka.dispatch.Envelope
包含SelectChildName
来自akka.remote.RemoteActorRefProvider$RemoteDeadLetterActorRef
.
这些消息的保留堆非常大,会导致内存问题。
SelectChildName
这些消息的目的是什么?有没有办法避免它们?
仅供参考,这似乎与两个参与者系统之间发生的解除关联错误有关。
谢谢,迈克尔
SelectChildName
Akka Remoting 使用消息来解析远程参与者。如果您看到很多,那么您有可能直接与一个 交互ActorSelection
,而不是一个ActorRef
。
例如,每次您向 发送消息时ActorSelection
(这些取自docs)
val selection = context.actorSelection("akka.tcp://actorSystemName@10.0.0.1:2552/user/actorName")
selection ! "Pretty awesome feature"
解决了 - 可能是远程的 - 演员,这涉及到SelectChildName
底层 Akka 基础设施的消息交换。
如果是这种情况,请尝试直接使用ActorRef
s. 您可以ActorSelection
使用该resolveOne
方法从 an 中获取一个。
再次引用文档:
总是最好使用它们的 ActorRef 与其他 Actor 进行通信,而不是依赖于 ActorSelection。例外是
- 使用至少一次传递工具发送消息
- 开始与远程系统的第一次联系