Akka邮件传递保证

编程入门 行业动态 更新时间:2024-10-23 17:35:20
本文介绍了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邮件传递保证

本文发布于:2023-11-25 03:02:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1628051.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:邮件   Akka

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!