我正在使用熟悉的事件溯源模式构建服务:
- 收到请求。
- 聚合的历史被加载。
- 聚合被重建(从它的历史)。
- 准备好新事件并更新聚合以响应来自步骤 1 的传入请求。
- 这些事件被写入日志,并可供任何订阅者使用(发布)。
就我而言,步骤 5 分两部分完成。事件将写入事件日志。后台进程从事件日志中读取并发布从偏移量开始的所有事件。
在某些情况下,除了与聚合相关的事件之外,我还需要发布副作用。就系统而言,这些也是事件,因为它们被其他服务消费并影响其他服务的状态。但是,它们不会影响此服务中聚合的历史记录,也不需要重建它。
我应该如何在代码中处理这些?
选项 1 - 不要将副作用事件写入事件日志。在第 5 步之前的主流程中发布这些内容。
选项 2- 将所有内容写入事件日志并在加载历史记录时忽略副作用事件。(这些不是历史的一部分!)
选项 3- 将副作用事件写入虚拟聚合,以便发布它们,但从不加载。
选项 4-?
在第一个选项中,如果存在并发冲突,可能会出现问题。如果第 5 步写入失败,那么副作用就不能轻易回滚。第二个选项写入不属于聚合历史的事件。在步骤 2 中加载时,必须忽略这些副作用事件。第三个选项感觉就像一个黑客。
你觉得这些中的哪一个是正确的?