Akka 消息传递保证
Akka Message Delivery Guarantees
我正在尝试找出 Akka 支持的消息传递保证。我得出以下结论:
At-most-once : Supported by default
At-least-once : Supported with Akka Persistence
Exactly-once : ?
Akka支持exactly-once吗?如果没有,我将如何实现?
正如您所发现的,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 处理,接收方必须确保同一消息的重复实例只会导致工作完成一次。这可以通过让接收器完成的工作是幂等的,以便它可以重复应用,或者让接收器记录它已经处理的内容来实现。对于 At-Most-Once,责任由接收者承担:
class AtMostOnceReceiver extends Actor {
var workDone = false
def receive = {
case "Do Work" =>
if(!workDone) {
doWork()
workDone = true
}
sender ! Ack
}
}
我正在尝试找出 Akka 支持的消息传递保证。我得出以下结论:
At-most-once : Supported by default
At-least-once : Supported with Akka Persistence
Exactly-once : ?
Akka支持exactly-once吗?如果没有,我将如何实现?
正如您所发现的,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 处理,接收方必须确保同一消息的重复实例只会导致工作完成一次。这可以通过让接收器完成的工作是幂等的,以便它可以重复应用,或者让接收器记录它已经处理的内容来实现。对于 At-Most-Once,责任由接收者承担:
class AtMostOnceReceiver extends Actor {
var workDone = false
def receive = {
case "Do Work" =>
if(!workDone) {
doWork()
workDone = true
}
sender ! Ack
}
}