Akka邮件传递保证 [英] Akka Message Delivery Guarantees

查看:72
本文介绍了Akka邮件传递保证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试找出Akka支持的消息传递保证。我得出以下结论:

I am trying to find out what message delivery guarantees Akka supports. I came to the following conclusion:


最多一次:默认情况下受支持

At-most-once : Supported by default

至少一次:受Akka Persistence支持

At-least-once : Supported with Akka Persistence

完全一次:?

Akka是否仅支持一次?如果没有,我将如何实现呢?

Does Akka support exactly-once? How would I be able to achieve this if it doesn't?

推荐答案

开箱即用的Akka提供了At-Most-Once正如您所发现的。某些库(例如Akka Persistence)提供了At-Least-Once,您可以通过在actor中创建ACK-RETRY协议来轻松地自己创建。发件人会定期发送消息,直到接收者确认收到为止。

Akka out of the box provides At-Most-Once delivery, as you've discovered. At-Least-Once is available in some libraries such as Akka Persistence, and you can create it yourself fairly easily by creating an ACK-RETRY protocol in your actors. The Sender keeps periodically sending the message until the receiver acknowledges receipt of it.

简单地说,对于最低一次,责任在于发件人。例如在Scala中:

Put simply, for At-Least-Once the responsibility is with the Sender. E.g in Scala:

class Sender(receiver: ActorRef) extends Actor {

  var acknowledged = false

  override def preStart() {
    receiver ! "Do Work"
    system.scheduler.scheduleOnce(50 milliseconds, self, "Retry")
  }

  def receive = {
    case "Retry" => 
      if(!acknowledged) {
        receiver ! "Do Work"
        system.scheduler.scheduleOnce(50 milliseconds, self, "Retry")
      }

    case "Ack" => acknowledged = true
  }
}

class Receiver extends Actor {

  def receive = {
    case "Do Work" => 
      doWork()
      sender ! "Ack"
  }

  def doWork() = {...}
}

但是,采用一次最多一次处理时,接收者必须确保同一消息的重复实例仅导致一次工作完成。这可以通过使接收机等当做功,使其可以被重复应用,或者让接收机保存已经处理过的记录来实现。对于一次最多一次,责任由接收者承担:

But with At-Most-Once processing, the receiver has to ensure that repeated instances of the same message only result in work being done once. This could be achieved through making the work done by the receiver idempotent so it can be repeatedly applied, or by having the receiver keep a record of what it has processed already. For At-Most-Once the responsibility is with the receiver:

class AtMostOnceReceiver extends Actor {

  var workDone = false

  def receive = {

    case "Do Work" =>
      if(!workDone) {
        doWork()
        workDone = true
      }
      sender ! Ack
  }

}

这篇关于Akka邮件传递保证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆