在现代Akka中,我是否只应从actor内部发送actor消息?

4

在关于Actor Worst Practices的问题上,其中一个答案说:

Always send a message from an Actor-subsystem thread. If this means creating a transient Actor via the Actor.actor method then so be it:

case ButtonClicked(src) => Actor.actor { controller ! SaveTrade(trdFld.text) }
这篇答案是在2009年写的。这个做法现在是否仍然是良好的实践?它适用于Akka actors吗?
我认为我的问题不是从一个非actor发送消息到actor是否是不好的实践的重复,因为那是指旧版的actor系统。它解释了“最差实践”文章背后的原理。
1个回答

4
不,Akka没有旧版Scala actors存在的问题,即可能为每个线程创建一个ActorProxy,导致其不断增长的邮箱泄漏内存。
现在来看看 "!":
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit

如果您发送消息并且不在另一个Actor内,则发送方默认为Actor.noSender。引用文档中的话:

默认占位符(null)用于“!”以指示没有消息的发送者,这将被翻译为接收系统的死信。

如果您发送的Actor尝试回复,则会得到死信。如果需要,可以记录这些死信,但它们不会导致内存泄漏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接