akka - 如何告诉akka actor成功发送消息到其他actor的邮箱?

标签 akka lookup actor sender

这是我的关键任务应用程序中的场景: Actor A 执行一些资源密集型工作,然后向另一个物理 Unix 机器上的 Actor B 发送消息。 B 正在访问外部网络元素,可能需要很长时间来处理该消息。 B 然后将处理结果发送回 A。

Q1:A 使用 B 的路径查找 B。如果 B 的 unix 机器已关闭或 B 尚未启动,则查找将失败。 akka 文档说返回了像 actor ref 这样的死信。我如何测试它是正常的 actor ref 还是返回类似死信的 actor ref?

Q2:假设 B 的普通 actor ref 是 return。如果 A 使用 B.tell() 向 B 发送消息,并且消息无法到达 B 的持久邮箱,那么我如何知道发生了这种情况,以便 A 可以将消息发送到具有持久邮箱的本地参与者 C? C 将永远尝试将消息传递给 B,直到成功为止。

最佳答案

答案 1:

system.actorFor(someRemotePath) 始终为您提供一个远程 actor 引用,并且无法通过检查此引用来查明它指向的 actor 是否存在或可以到达。查明该给定 URI 是否有参与者的唯一方法是发送一条消息:如果您收到回复,那么它还处于事件状态,如果在一段合理的时间后没有回复,您必须假设它已关闭并且/或重试 - 尽管很可能由于防火墙重新启动或其他原因导致回复消息丢失。

答案 2:

您的参与者 C 是您所有问题的解决方案:您需要始终发送到 C 并让其确保该消息最终被远程参与者确认。在 Akka 中无法查明给定消息是否已发送到邮箱,因为这并不意味着 actor 无论如何都可以成功处理该消息。

总的来说,我建议阅读 message delivery guarantees 上的文档,特别是在实现关键任务应用程序之前。

关于akka - 如何告诉akka actor成功发送消息到其他actor的邮箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14669740/

相关文章:

c++ - 查找表究竟是如何工作的以及如何实现它们?

Kotlin Actor 到 Actor 的通信

java - 在 Guice 初始化中使用先前注入(inject)的绑定(bind)

configuration - Typesafe Config环境变量

javascript - crm2013 - 如何过滤特定实体的客户端查找

Python:如何从数据帧中行查找数据并根据列匹配在另一个数据帧中相乘

.net - Scala.net 中的 Actor

scala - 处理 apache-camel 中的连接失败

scala - Akka actor 杀死/重启行为

scala - akka typed 中的询问模式示例