在Event-sourcing中如何处理生产失败?

In Event-sourcing how to deal with failure in production?

所以假设我想使用事件驱动架构事件源制作一个电子商务系统。假设用户想要购买一种产品,它的价格是 1 美元, 但我没有计算 ,它变成了 2 美元。现在用户将从他的钱包中损失 2 美元而不是 1 美元。所以如果它是 CRUD 我可以简单地修复这个错误并连接到数据库主机并修复用户钱包(也给他一些道歉)。但据我所知,在事件溯源中,我们不应该编辑或删除事件(只能追加),因为它是唯一的真实来源。那么我应该如何处理这种故障呢?我能想到的一件事是创建一个管理页面,它可以发布任何类型的事件并像这样修复它。

AccountCreatedEvent { userId: 1, balance: 3 }
ProductPurchasedEvent { userId: 1, price: 2 } // **miss calculate price should be 1$
DepositMoneyEvent { userId: 1, amount: 1 } // manually fixed by admin

我知道这看起来很奇怪,但是如果我真的必须修复错误并验证数据怎么办我们如何在事件溯源中实现它

一个常见的答案是您查看域。例如,存在哪些业务流程可以减轻客户被多收费用的意外情况? 我们的企业有退款流程吗?

“正确”的答案是实施该流程。由此产生的历史记录看起来像是一个向客户多收费用的事件,后来是另一个退还多收费用的事件以纠正问题。

当然,这正是您解决问题并道歉的方法;主要区别在于我们将纠错视为系统的一部分,而不是我们即兴创作的东西。

Memories, Guesses, and Apologies(Pat Helland,2007 年)是一个很好的起点。

另一个例子是系统做了正确的事情,但记录了错误的信息。这里的一个常见模式是按照会计中的方式处理这个错误——产生一个事件来“逆转”转录错误,并创建一个新事件来引入正确的会计。

再次注意,此更正过程是会计领域的一部分。我们的工作是忠实地 re-create 已经存在的纠错过程。

基本模式始终相同; we add more events to the system to correct the mistakes (and more events to correct instances in the corrections; it's turtles all the way down).

当您拥有由流中出现的事件触发的进程时,您可能最终会玩“追逐”。

我们多收了客户的钱,但这意味着客户自动加入了 VIP 折扣计划。当我们修复错误时,我们是否也需要删除他们的 VIP 状态?他们在发现错误之前进行的打折购买会怎样?