.net - 具有事件驱动架构但没有事件溯源的 CQRS
问题描述
在发布此之前,我参考了许多网站和学习平台,但看到了使用事件源开发 CQRS 的类似模式。同样,要进行适当的事件,您需要遵循 DDD 模式。我有以下问题。
- 我们可以通过从写入模型发布事件并使用事件处理程序在读取模型中使用它并更新读取数据库来保持读取和写入数据库同步吗
- 如果我的要求是只查看最新数据,为什么需要事件溯源和事件重播
- 我可以在事件到达事件处理程序时管理数据审计
- 如果出现竞争条件,我可以根据时间戳对消息进行版本控制。
- 请通过执行步骤 1,3 和 4 进行解释,我是否仍然遵循 CQRS 模式?
仅供参考,我使用 .NetCore 3.1、AWS Lambda 服务、MassTransit 作为 MessageBus 和 SQS 作为传输。
提前致谢。
解决方案
只要您有用于读取和写入的单独数据模型,您就在遵循 CQRS。事件溯源不是严格要求的。
请注意,在应用程序中以保持读取端与写入端预期最终一致性的方式完成 1 是相当困难的。当且仅当写入数据库的更新成功时,您需要确保发布事件(即,永远不会出现您发布但不更新的情况,也不会出现您更新但不发布的情况:如果其中任何一种都可能发生,则不能保证最终的一致性)。例如,如果您的应用程序进行更新并且如果成功,则发布事件,如果进程在更新和发布之间崩溃(或者您从数据库中获得网络分区,或者您的 lambda 超出其时间限制......)会发生什么?
确保最终一致性的 2 个最佳方法是
- 通过订阅已发布的事件流来更新写入端数据库
- 在写入端 DB 上使用更改数据捕获来生成要发布的事件
第一个至少非常接近事件溯源(有人可以争论任何一种方式:我会说这取决于您的设计将发布的事件流视为事实来源的程度)。其次,请记住,您基本上已经失去了围绕该事件发生的所有上下文领域知识:您只看到数据库表示模型的变化。
事件溯源和 CQRS 相辅相成(你也可以不做 CQRS 也可以事件溯源,虽然只有在某些应用中,不做 CQRS 的 ES 才是实用的);事件溯源倾向于让您将域保持在前端和中心,并且由于它是仅附加的,因此它是您可以拥有的最优化的写入模型。
推荐阅读
- docker - 如何将 Docker Desktop Kubernetes 集群迁移到 Google Kubernetes Engine
- java - 如何使用 for 循环获取集合中的输入?
- python - 读取 CSV 时出现 Geohash KeyError
- android - 如何将 parcelable 数组列表转换为实现 parcelable 的对象的数组列表?
- mysql - 当我得到请求为空的变量时
- ffmpeg - 是否可以将 FFmpeg 隔行扫描未连接的视频文件合并?
- sql-server - 如何生成具有独立备份链的数据库的完整备份?
- wordpress - 单击菜单页面时内容不可见 - Wordpress
- ruby-on-rails - Rails Helper 创建意外的数组输出
- typescript - 字符串的 TypeScript 联合不能分配给函数中的元组联合