【问题标题】:Akka: Adding a delay to a durable mailboxAkka:为持久邮箱添加延迟
【发布时间】:2012-12-17 06:21:01
【问题描述】:

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

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

有没有什么简单的方法可以在 AKKA 中延迟消息的处理?我知道我可能可以设置一个外部分布式队列,例如 ActiveMQ、RabbitMQ,它可能具有此功能,但我宁愿没有。

我知道我需要使邮箱持久耐用,这样它才能在重新启动或崩溃时幸免于难。我们已经有了 mongo 设置,所以我可能会使用 MongoBasedMailbox 来保证持久性。

【问题讨论】:

    标签: scala queue message-queue akka


    【解决方案1】:

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

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

    • 内置指数重试,无限期间隔
    • 故障处理。例如,如果在配置的时间间隔内两次更新都无法成功,它允许执行通知另一个服务的任务。
    • 支持长时间运行的心跳操作
    • 能够实现复杂的任务依赖。例如,在发生不可恢复的故障时实现调用链或补偿逻辑 (SAGA)
    • 提供对当前更新状态的完整可见性。例如,当使用队列时,您知道队列中是否有一些消息,并且您需要额外的数据库来跟踪整体进度。使用 Temporal 记录每个事件。
    • 能够取消正在进行的更新。
    • 请求限制

    请参阅the presentation,了解时间编程模型。讲的是Temporal的前身Cadence。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你能提供关于石英耐久性的任何报价或链接吗?如果没有这样的保证,为什么不使用plain scheduler
      • 同意,如果“少量工作”的结果需要在重启后仍然存在,您只需在 preRestart 期间以某种方式保存状态。耐用性是为了应对崩溃。
      • @om-nom-nom - Quartz 有一个persistent job feature
      • 骆驼可以工作,但我正在寻找不太大的东西。
      【解决方案3】:

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

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

      我不确定在你的情况下你必须使用 FSM (Finite State Machine) ,所以你基本上可以只使用一个 persistentActor 来保存插入作业的时间,并在那个时间启动一个调度程序。这样 - 即使您重新启动服务器,actor 也会启动并创建一个新的计划作业,使用持久数据计算剩余的运行时间

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        相关资源
        最近更新 更多