Akka.Net如何在消息处理期间处理系统故障

时间:2018-02-16 16:42:20

标签: akka.net akka-cluster

假设其中一个群集节点收到一条消息,其中一个actor开始处理它。在这个节点的中间,这个节点因某种原因而死亡。消息会发生什么,我的意思是它会被另一个可用节点处理还是会丢失?

1 个答案:

答案 0 :(得分:0)

默认情况下,akka(以及所有其他演员模型框架)提供最多一次交付。这意味着使用尽力而为的保证将消息发送给参与者 - 如果他们未能达到目标,他们将无法重新传递。这也意味着,如果消息到达目标,但与之关联的进程在完成之前被中断,则不会被重试

话虽如此,有许多方法可以提供具有各种保证的演员之间的重新传递。

  1. 最简单和最不可靠的是将Ask模式与ie Polly库结合使用。然而,如果发送者所在的节点将会死亡,这将无济于事 - 仅仅因为消息仍然只存储在内存中。
  2. 更可靠的模式是在群集前使用某些事件日志/队列(即Azure Service Bus,RabbitMQ或Kafka)。在这种方法中,客户端通过总线/队列发送请求,而进程管道中的第一个actor负责拾取请求。如果管道中的某个actor或节点死亡,则正在重试该消息的整个管道。
  3. 另一个想法是使用Akka.Peristence模块中的at-least-once delivery。它允许您使用持久性actor的事件处理功能来保留消息。然而IMO需要与Akka一点经验。
  4. 所有这些方法都至少提供一次交付保证,这意味着可以不止一次地向同一个消息发送相同的消息。这也意味着,您的处理逻辑需要通过幂等行为或通过识别和删除接收方的重复来确认。