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