3

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

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

Q2:假设B的正常actor ref是return。如果 A 使用 B.tell() 将 msg 发送到 B 并且 msg 无法到达 B 的邮箱,这是持久的,我怎么知道它发生了,以便 A 可以将 msg 发送到具有持久邮箱的本地演员 C?C 将一直尝试将消息传递给 B,直到它成功为止。

4

1 回答 1

3

答案1:

system.actorFor(someRemotePath)总是给你一个远程actor ref,并且没有办法通过检查这个ref 来找出它指向的actor 是否存在或可以到达。找出在给定 URI 上是否存在 actor 的唯一方法是发送一条消息:如果您收到回复,那么它是活跃的,如果在一段合理的时间后没有回复,您必须假设它已关闭和/或重试——尽管很可能由于防火墙重新启动或其他原因而导致回复消息丢失。

答案 2:

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

一般来说,我建议阅读有关消息传递保证的文档,尤其是在实施关键任务应用程序之前。

于 2013-02-03T08:57:22.143 回答