我正在尝试找出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邮件传递保证
发布评论