Akka是否要求模式摆脱目标演员邮箱上的超时消息?

时间:2015-10-20 09:53:13

标签: akka

假设我有2个演员A和B,A要求B在10秒内超时响应。之后,B仍然忙于处理其他无法在10秒内响应A的消息,因此演员A中的Future获得超时异常。

问题是:

1)演员A出现异常后,A发送给B的消息是否仍然在B&#39的邮箱内等待B处理?

2)如果是,如何防止/检测B形式的消息?

1 个答案:

答案 0 :(得分:0)

答案是肯定的,该消息仍在B&#39的框中。在许多情况下,Future这是一个非常普遍的误解,比如问题模式,在这种情况下,你有一些请求在未来有限的时间内超时;大多数人会认为这意味着当等待的过程被取消但是像Future这样的通用抽象无法做到这一点时(也记住Future≠{{1} })。

至于第二个问题,答案是没有简单的答案,你需要考虑适合你环境的策略。如果所有actor都驻留在同一个VM中,您可以在消息中嵌入时间戳,以在目标actor上验证它们;这仍然很活泼,因为演员B可以花费足够的时间处理消息以触发A侧的超时,从而产生不一致(即A认为操作失败,B事情成功)。

否则,在分布式环境中,一个想法可能是当actor A检测到超时时向actor B发送补偿动作。你可能想要看一下 Saga Pattern (你可以找到一个很好的谈话here),如果你正在做这样一个基于演员的分布式系统,你就会遇到这种麻烦情况。在任何情况下,只要记住分布式系统很难,没有灵丹妙药或任何方法努力使它们正确。