【问题标题】:How to perform non-idempotent actions (send email) in a Actor model framework (e.g., akka.net)?如何在 Actor 模型框架(例如 akka.net)中执行非幂等操作(发送电子邮件)?
【发布时间】:2023-03-29 09:55:01
【问题描述】:

我正在研究使用参与者模型框架(具有 akka.net 持久性的 akka.net,但我正在寻找一般案例答案)来构建“小部件订单处理工作流程”。

相当标准:

  1. 客户订单小部件
  2. 付款已处理
  3. 已向客户发送确认电子邮件
  4. 向仓库发送选择列表消息
  5. 仓库发回“小部件已发货”消息
  6. 向客户发送“您的商品已发货”电子邮件

现在假设在 4 和 5 之间发生服务器部署/重启。这将导致演员补水(假设还没有快照)。这意味着我们将再次处理付款,并重新发送已下订单的电子邮件。然而事实证明,我们的客户不喜欢这个“功能”!

如何在使用 Actor 模型框架时防止非幂等操作再次发生?

我考虑过单独存储“为订单数据库表处理的付款”;但这感觉就像我在与框架/范式作斗争,我想知道是否有一种“正确”的方式来做这种事情!

【问题讨论】:

    标签: akka actor akka.net


    【解决方案1】:

    好吧,事实证明这很简单。

    通过 akka.net 持久性,系统还原后,消息会被重播。可以通过(重新)处理这些消息来重新创建正确的状态。

    但是有一个IsRestoring 属性,可以检查它以查看这是第一个处理还是后续处理。想必其他actor模型框架也有类似的东西。

    所以你做这样的事情:

    private void ProcessPayment (Order message)
    {
        if(!this.IsRestoring){
            //Perform non-idempotent payment process
        }
    }
    

    【讨论】:

      【解决方案2】:

      要制作强大的工作流处理器,您必须将工作流过程的所有数据存储在永久存储中。

      您可以使用数据库、Kafka 等消息传递系统,或使用现成的工作流管理软件。

      既然你已经在使用 Akka,Akka Persistence 也可以作为一个选项。

      更新

      构建一个在出现系统故障和重启的情况下继续正常工作的系统是一项艰巨的任务,远比开发一个参与者框架复杂得多。也就是说,您不能只采用任何 Actor 框架并为其添加容错能力。

      【讨论】:

      • 很好的信息谢谢,但是您似乎没有讨论任何特定于“演员模型框架”的内容您认为您是否可以在考虑到这一点的情况下扩展您的答案?
      猜你喜欢
      • 2012-03-11
      • 2019-05-02
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多