CQRS + ES 我们应该持久化命令和查询吗?

CQRS + ES shall we persist commands and queries?

处理程序通常使用命令来修改聚合状态并发出事件,这些事件会持久保存到事件存储中。

但是根据今天的业务逻辑,我们可能会发出一些事件,而明天不会发出一些事件...我想知道这是否意味着命令也应该持久化?您对此有何经验?

出于某些分析目的,恕我直言,可能还会保留查询...

这是个好问题。要记住的关键是事件源系统中的事件代表已经发生的事情。仅仅因为你在未来改变了逻辑并不会改变事件已经发生的事实。您如何处理这些已弃用的事件是您需要考虑的事情。

您可以选择多条路线。一种可能性是为事件创建升级程序。您 运行 通过升级过程有效地将其转换为下一个版本,而不是处理该事件。另一种途径是在模型内进行升级工作。您甚至可能会发现在新系统中可以完全忽略它。

无论您决定做什么,最重要的是要考虑整个事件流。确保您所做的更改不会妨碍您重新运行您的活动。不要破坏您的活动流!

我在 post 我写的一篇文章中对此进行了更深入的回应。您可以在这里找到它:How to Upgrade CQRS Events Without Busting Your Event Stream

希望对您有所帮助。

关于您关于存储查询和命令的其他观点。您可以同时执行这两项操作,但是,出于不同的原因,您需要谨慎对待它们。

除非您的整个系统都基于 CQRS 和 ES,否则重新运行ning 命令可能会失败,因为其他系统不同步。这不是事件流的问题。您还应该确保在命令中处理敏感信息。例如,它们可能包含未加密的信息,并期望它在域内被加密。

关于查询:CQRS 的驱动因素之一是平均业务线系统中读取与写入的比率。如果您记录查询,您可能会损害性能并且可能对存储有更高的要求 space 来处理数据的增长。

我发现记录命令和查询比只存储它们更有用。通过这种方式,我可以了解最常获得 运行 的内容、持续时间和成功的历史记录。要监控的所有有用的健康统计数据。

无论如何,希望对您有所帮助。