【问题标题】:Akka Message Delivery GuaranteesAkka 消息传递保证
【发布时间】:2015-03-16 10:58:18
【问题描述】:

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

最多一次:默认支持

至少一次:支持 Akka 持久性

恰好一次:?

Akka 是否支持完全一次?如果没有,我怎么能做到这一点?

【问题讨论】:

标签: akka


【解决方案1】:

如您所见,开箱即用的 Akka 提供“最多一次”交付。 At-Least-Once 在某些库中可用,例如 Akka Persistence,您可以通过在您的 actor 中创建一个 ACK​​-RETRY 协议来相当轻松地自己创建它。发送者会定期发送消息,直到接收者确认收到。

简单地说,对于至少一次,责任在于发件人。例如在 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() = {...}
}

但是对于 At-Most-Once 处理,接收方必须确保同一消息的重复实例只导致工作完成一次。这可以通过使接收者完成的工作具有幂等性来实现,以便可以重复应用,或者让接收者记录它已经处理的内容。对于最多一次,责任在于接收方:

class AtMostOnceReceiver extends Actor {

  var workDone = false

  def receive = {

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多