我有两个通过akka远程通信进行通信的actor系统。
当我查看JVM堆时,我也看到akka.dispatch.Envelope
包含来自SelectChildName
的{{1}}条消息的许多实例。
这些消息的保留堆很大,会导致内存问题。
这些akka.remote.RemoteActorRefProvider$RemoteDeadLetterActorRef
消息的目的是什么?有没有办法避免它们?
FYI这似乎与两个演员系统之间发生的Disassociation错误有关。
谢谢, 米凯尔
答案 0 :(得分:1)
SelectChildName
消息来解析远程actor。如果您看到很多内容,则可能会直接与ActorSelection
进行互动,而不是ActorRef
。
每次向ActorSelection
发送消息时(例如,这些消息来自docs)
val selection = context.actorSelection("akka.tcp://actorSystemName@10.0.0.1:2552/user/actorName")
selection ! "Pretty awesome feature"
- 可能是远程 - 演员被解决,这涉及到底层Akka基础设施交换SelectChildName
消息。
如果是这种情况,请尝试直接使用ActorRef
。您可以使用ActorSelection
方法从resolveOne
获取一个。
再次引用docs:
使用其他Actors进行通信总是比较好 他们的ActorRef而不是依赖于ActorSelection。例外是
- 使用至少一次交付工具发送消息
- 首次与远程系统联系