Akka:为持久邮箱添加延迟

时间:2013-01-02 21:37:14

标签: scala queue message-queue akka

我想知道是否有某种方法可以延迟处理akka消息?

我的用例:对于我的每个请求,我都需要做少量的工作,然后我需要在两小时后完成额外的工作。

有没有简单的方法可以延迟处理AKKA中的邮件?我知道我可以设置一个外部分布式队列,例如ActiveMQ,RabbitMQ,它可能具有此功能,但我不愿意。

我知道我需要使邮箱持久耐用,这样它才能在重启或崩溃后继续存在。我们已经设置了mongo,所以我可能会使用MongoBasedMailbox来保持持久性。

3 个答案:

答案 0 :(得分:0)

它并不理想,但Akka Camel Quartz scheduler可以解决问题。比内置的ActorSystem调度程序更重量级,但知道Quartz有自己的问题。

答案 1 :(得分:0)

你仍然可以使用正常的Akka调度程序,你只需要保持actor持久性的状态,以避免在服务器重新启动时丢失作业。

我最近使用了PersistentFsmActor - 它将保持actor的状态持久

我不确定在你的情况下你必须使用FSM(有限状态机),所以你基本上只需要使用persistentActor来节省插入作业的时间,并启动一个调度程序到那个时候。这样 - 即使你重新启动服务器,actor也会启动并创建一个新的预定作业,使用持久数据来计算剩下的时间来运行它

答案 2 :(得分:0)

Cadence Workflow能够以最小的努力支持您的用例。您可以将其视为Durable Actor平台。当包括线程和局部变量在内的参与者状态在整个进程重新启动时得以保留时。

Cadence为任务处理提供了许多其他功能。

  • 构建具有无限到期间隔的指数重试
  • 故障处理。例如,它允许执行一个任务,如果在配置的时间间隔内两次更新均未成功,则该任务会通知另一服务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖性。例如,在无法恢复的故障(SAGA)的情况下实现呼叫链或补偿逻辑的链接
  • 完全了解更新的当前状态。例如,当使用队列时,您就会知道队列中是否有某些消息,并且需要其他数据库来跟踪总体进度。使用Cadence可以记录每个事件。
  • 能够取消正在进行的更新。
  • 限制请求

请参见介绍Cadence编程模型的the presentation