Akka 问模式是否摆脱了目标演员邮箱中的超时消息?
Does Akka ask pattern get rid of timed out message on target actor's mailbox?
假设我有 2 个演员,A 和 B,A 要求 B 在 10 秒超时内做出响应。之后 B 仍然忙于处理其他消息,无法在 10 秒内响应 A,因此 actor A 中的 Future
出现超时异常。
问题是:
1) actor A异常后,A发给B的消息是否还在B的邮箱里等待B处理?
2) 如果是,如何prevent/detect B 形成淹没消息?
答案是肯定的,邮件还在B的信箱里。在许多情况下,这是一个关于 Future
s 的常见误解,例如询问模式,在这种情况下,您有一些请求正在进行,由在有限的时间后超时的未来表示;大多数人会认为这意味着等待的过程将被取消,但是像 Future
这样的通用抽象无法做到这一点(还要记住 Future
≠ Thread
).
至于第二个问题,答案是没有简单的答案,您需要考虑适合您环境的策略。如果您所有的参与者都驻留在同一个虚拟机中,您可以在消息中嵌入时间戳以在目标参与者上验证它们;这仍然是活泼的,因为参与者 B 可能需要足够的时间来处理消息以触发 A 端的超时,从而产生不一致(即 A 认为操作失败,B 认为操作成功)。
否则,在分布式环境中,一个想法可能是当 actor A 检测到超时时向 actor B 发送一个补偿动作。你可能想看看 Saga Pattern(你可以找到一个很好的演讲 here)如果你正在做这样一个基于 actors 的分布式系统并且你遇到了麻烦在这种情况下。无论如何,请记住,分布式系统很难,没有灵丹妙药,也没有任何方法可以通过努力学习来使它们正确。
假设我有 2 个演员,A 和 B,A 要求 B 在 10 秒超时内做出响应。之后 B 仍然忙于处理其他消息,无法在 10 秒内响应 A,因此 actor A 中的 Future
出现超时异常。
问题是:
1) actor A异常后,A发给B的消息是否还在B的邮箱里等待B处理?
2) 如果是,如何prevent/detect B 形成淹没消息?
答案是肯定的,邮件还在B的信箱里。在许多情况下,这是一个关于 Future
s 的常见误解,例如询问模式,在这种情况下,您有一些请求正在进行,由在有限的时间后超时的未来表示;大多数人会认为这意味着等待的过程将被取消,但是像 Future
这样的通用抽象无法做到这一点(还要记住 Future
≠ Thread
).
至于第二个问题,答案是没有简单的答案,您需要考虑适合您环境的策略。如果您所有的参与者都驻留在同一个虚拟机中,您可以在消息中嵌入时间戳以在目标参与者上验证它们;这仍然是活泼的,因为参与者 B 可能需要足够的时间来处理消息以触发 A 端的超时,从而产生不一致(即 A 认为操作失败,B 认为操作成功)。
否则,在分布式环境中,一个想法可能是当 actor A 检测到超时时向 actor B 发送一个补偿动作。你可能想看看 Saga Pattern(你可以找到一个很好的演讲 here)如果你正在做这样一个基于 actors 的分布式系统并且你遇到了麻烦在这种情况下。无论如何,请记住,分布式系统很难,没有灵丹妙药,也没有任何方法可以通过努力学习来使它们正确。