Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 重播事件以进行调整_Design Patterns_Cqrs_Event Sourcing - Fatal编程技术网

Design patterns 重播事件以进行调整

Design patterns 重播事件以进行调整,design-patterns,cqrs,event-sourcing,Design Patterns,Cqrs,Event Sourcing,假设我正在开发一个使用“事件来源”(存储业务事件)的系统,该系统可以购买和销售材料;在某个时候,会生成一份包含价格和成本信息的报告 想象一下,我的一个客户打电话给我说,“成本是错误的,对我来说,利润的规则是这样的” 我可以添加更多处理程序或更改规则以适应这种特殊情况,并重播事件 但我的问题是,这是正确的方法(或者至少更好)?在一个事件源系统中,事件是不可变的——发生了什么的简单事实。重写这些事件的历史是人们根本无法做到的事情[1] 更改基于这些事件得出结果的计算逻辑绝对是一件正常的事情(这是即使

假设我正在开发一个使用“事件来源”(存储业务事件)的系统,该系统可以购买和销售材料;在某个时候,会生成一份包含价格和成本信息的报告

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

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


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

在一个事件源系统中,事件是不可变的——发生了什么的简单事实。重写这些事件的历史是人们根本无法做到的事情[1]


更改基于这些事件得出结果的计算逻辑绝对是一件正常的事情(这是即使是外包也能做到的关键事情之一)

你是否真的改变了你的代码或者提供了一个替代算法是一个选择的问题——如果原来的是一个bug(听起来像你的情况),那么改变代码。如果没有,写一个新的

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

如果您已将事件投影并反规范化到持久性存储中,并且已确定该情况代表一个bug,则通常的方法是:

  • 吹走现有的非规范化状态
  • 重播事件以产生预期的替代派生
  • 请注意,只有当您有一个非临时的非规范化状态存储,它保留了根据现在被取代的基础计算的值时,这一点才起作用。(将非规范化状态投影到内存中是完全有效的;在这种情况下,“吹走”更简单)

    另一种情况是,您已经实施了快照优化——在这种情况下,您还可以重新规划以不同的方式进行非规范化


    [1] 是的,有一些奇异的情况可以证明它是正确的,但这是一个.001%的情况

    对不起,如果这是一个非结构化的问题,我对DDD/CQRS和ES不熟悉,对我来说这是一个真实的用例。更改基于这些事件得出结果的计算逻辑绝对是一件正常的事情(这是即使是采购也能实现的关键因素之一)。就这样,谢谢