重播事件以进行调整

Replay events for adjustments

假设我正在开发一个系统,该系统使用 "Event Sourcing"(存储业务事件)来购买和销售材料;有时会生成一份包含价格和成本信息的报告。

假设我的一位客户打电话给我说,"The costs are wrong, for me, the rules from profit are this way"。

我可以添加更多处理程序或更改规则以适应这种特殊情况,然后重播事件。

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

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

根据这些事件更改得出结果的计算逻辑绝对是一件很正常的事情(这是即使是采购也能实现的关键事情之一)。

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

在某些情况下(通常不建议),总是从原始事件开始处理所有事情;如果是这样,你只需要改变你的推导逻辑就大功告成了。

如果您投影事件并非规范化为持久存储,并确定该情况代表bug,正常做法是:

  1. 吹走现有的非规范化状态
  2. 重播事件以产生预期的替代推导

请注意,只有当您有一个非短暂的非规范化状态存储,该存储保留基于现在被取代的基础上计算的值时,这才会起作用。 (将非规范化状态投射到内存中是完全有效的;在这种情况下,'blowing away' 更简单)。

另一种情况是您已经实施了快照优化 - 在这种情况下,您也会重新投影以不同方式进行非规范化。

[1] 是的,有一些奇特的案例可以证明它是合理的,但那是 .001% 的案例