重播事件以进行调整

时间:2016-11-11 12:12:47

标签: design-patterns cqrs event-sourcing event-store get-event-store

假设我正在使用一个系统,该系统使用“事件采购”(存储业务事件)来购买和销售材料;在某个时刻,会生成一份报告,其中包含价格和费用信息。

想象一下,我的一位客户打电话给我说:“成本是错误的,对我来说,利润的规则是这样的。”

我可以添加更多处理程序或更改规则以适应此特定情况,并重播事件。

但我的问题是,这是正确的方法(或至少更好)?

1 个答案:

答案 0 :(得分:1)

在事件源系统中,事件是不可变的 - 事件的简单事实。重写事件的历史是一件根本不做的事情[1]。

更改基于这些事件得出结果的计算逻辑绝对是正常的事情(这是即使采购也是关键因素之一)。

无论您是实际更改代码还是提供替代算法都是一个选择问题 - 如果原始文件实际上是一个错误(听起来像您的情况),请更改代码。如果没有,请写一个新的。

在某些情况下(通常不建议),人们总是从原始事件开始工作;如果是这样的话,你所要做的就是改变你的推导逻辑,你已经完成了。

如果你将事件投射并且非规范化为持久存储,并且已经确定情况代表了一个错误,那么通常的做法是:

  1. 吹走现有的非规范化状态
  2. 重播事件以产生预期的替代推导
  3. 请注意,只有当您拥有一个非短暂的非规范化状态存储区时,才会发挥作用,该存储区保留在现在被取代的基础上计算的值。 (将非规范化状态投射到内存存储中是完全有效的;在这种情况下,“吹走”更简单)。

    另一种情况是你实现了快照优化 - 在这种情况下,人们也会重新投射到不同的非规范化。

    [1]是的,有异国情况可以说是合理的,但这是一个.001%的案例