如何在参与者模型框架(例如akka.net)中执行非幂等操作(发送电子邮件)?

如何在参与者模型框架(例如akka.net)中执行非幂等操作(发送电子邮件)?,akka,actor,akka.net,Akka,Actor,Akka.net,我正在考虑使用一个演员模型框架akka.net和akka.net持久性,但我正在寻找一个通用的案例答案来构建一个“小部件订单处理工作流” 相当标准: 客户订单小部件 付款已处理 发送给客户的电子邮件确认 向仓库发送分拣单消息 仓库发回“小部件已装运”消息 向客户发送“您的商品已发货”电子邮件 现在让我们假设在4到5之间发生服务器部署/重启。这将导致演员补液让我们假设还没有快照。这意味着我们将再次处理付款,并重新发送下单电子邮件。然而事实证明,我们的客户不喜欢这个“功能” 在使用参与者模型框架时,

我正在考虑使用一个演员模型框架akka.net和akka.net持久性,但我正在寻找一个通用的案例答案来构建一个“小部件订单处理工作流”

相当标准:

客户订单小部件 付款已处理 发送给客户的电子邮件确认 向仓库发送分拣单消息 仓库发回“小部件已装运”消息 向客户发送“您的商品已发货”电子邮件 现在让我们假设在4到5之间发生服务器部署/重启。这将导致演员补液让我们假设还没有快照。这意味着我们将再次处理付款,并重新发送下单电子邮件。然而事实证明,我们的客户不喜欢这个“功能”

在使用参与者模型框架时,如何防止非幂等操作再次发生


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

要成为一个健壮的工作流处理器,您必须将工作流过程的所有数据存储在永久存储器中

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

既然你已经使用了Akka,也可以是一个选项

更新


构建一个在出现系统故障和重启时仍能正常工作的系统是一项相当艰巨的任务,远比开发参与者框架复杂得多。也就是说,您不能只采用任何actor框架并向其添加容错功能。

好吧,结果证明它非常简单

使用akka.net持久性,在系统恢复后,消息将被重放。通过重新处理这些消息,可以重新创建正确的状态

但是,有一个IsRestoring属性,可以检查该属性以确定这是第一个处理还是后续处理。想必其他参与者模型框架也有类似之处

所以你会做一些类似的事情:

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

很好的信息,谢谢,但是您似乎没有讨论任何特定于“演员模型框架”的内容。您认为您可以在考虑到这一点的情况下扩展您的答案吗?