使用 CQRS 的读取端实现方法

2024-03-18

我已经转移到积极使用 CQRS + 事件源的项目。乍一看它是按照所有这些书籍和博客来实现的,但最后我意识到实现中到底有什么问题。

Here is CQRS architecture:CQRS design

这张照片最初是我从here http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young.

正如我们在图中看到的,读取端从队列接收事件,并将其一一传递到不同的投影集(反规范化器)中,然后通过 AddOrUpdate 方法将生成的 ViewModel 保存到数据库中。因此,据我从图片中了解到,反规范化器只能依赖于事件本身以及读取端数据库中的数据。 例如:

  1. 帐户视图已存储在数据库中。
  2. EmailChanged 事件到达
  3. 我们从数据库读取Account视图
  4. 对其应用电子邮件更改
  5. 我们将帐户保存回数据库。

另一种情况(计算某些商品的数量,比如订单):

  1. OrderCreated 事件到达
  2. 我们读取代表 NumberOf 先前到达的订单的 ViewModel
  3. 增加并保存它。

我们的项目有什么: 我们仅将所有这些事件用作域模型中发生更改的通知程序。因此,我们所做的:

  1. 我们获取域存储库并读取所有必要的聚合。这样做我们可以获得它们的最新状态。
  2. 我们只是从头开始构建 ViewModel 对象
  3. 将新创建的对象保存到 Db 中

我们在项目中使用的方法对我来说看起来有点奇怪,但我看不出它的所有缺点。如果我们需要重建读取端,我们添加“活动”反规范化器,下次它收到特定事件时,它会重新创建新的视图模型。

如果我们使用书中的方法,我将必须在系统之外的某个地方有一个单独的实用程序逻辑来进行重建。为此我们需要什么:

  1. 删除读取面
  2. 从头开始读取事件存储中的所有事件
  3. 让它们穿过投影

所以我的问题是:
这里正确的方法是什么?


我们在项目中使用的方法对我来说看起来有点奇怪,我不能 但看到它的所有缺点。

一个突出的缺点是,在收到事件后,您必须对相应聚合的存储库进行额外的调用。这意味着该存储库必须直接公开或作为服务公开。除了增加依赖之外就是额外的IO。

对于从事件存储重建,您描述的方法是普遍接受的方法。描述的方法here https://abdullin.com/post/event-sourcing-projections/利用专用于重建投影的事件日志。这可用于解决重建时的性能问题。还看一下云中可扩展且简单的 CQRS 视图 http://abdullin.com/journal/2011/1/19/scalable-and-simple-cqrs-views-in-the-cloud.html and on DDD/CQRS 邮件列表 https://groups.google.com/forum/#!topic/dddcqrs/Tn080Iu0zqI.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CQRS 的读取端实现方法 的相关文章

  • Actor设计模式和现实世界的例子

    我目前正在学习 Actor 设计模式 或者模型 它看起来很有趣 然而 我正在努力寻找任何像样的现实世界示例来说明如何或在何处应用此模型 除了带有余额的简单银行帐户或游戏的敌人坐标等的基本示例之外 作为我研究的一部分 我遇到了一个示例电子商务
  • 在 CQRS 中实现基于集合的约束

    我仍在努力解决与 CQRS 风格架构相关的基本 和已解决 问题 我们如何实现依赖于的业务规则a set的聚合根 以预订应用程序为例 它可以帮助您预订音乐会门票 电影座位或餐厅餐桌 在所有情况下 只会有数量有限待售 物品 让我们想象一下该事件
  • 与旧系统的 CQRS

    我希望将一个具有清晰域模型的相对较新的基于 Web 的应用程序转换为更多 CQRS 风格的系统 我的新应用程序本质上是对现有旧系统的增强替代 我的组织中的现有系统共享一组通用数据库 这些数据库由整个公司孤岛中存在的无数应用程序 通过混沌方法
  • 事件溯源命令或来自外部系统的事件?

    在大多数情况下 我了解 CQRS ES 系统中命令和事件之间的区别 然而 有一种情况我想不通 假设我正在构建一个个人财务跟踪系统 用户可以在其中输入借方 贷方 显然 这些是命令 一旦经过验证 域模型就会更新并发布事件 然而 假设信用 借记信
  • kafka 上的无限期日志保留

    我正在使用 kafka 进行事件溯源 我意识到我们仍然需要配置日志保留时间 即log retention hours 如果我想无限期保留所有消息 最好使用什么值 示例配置为log retention bytes设置为 1 我可以在中也使用
  • CQRS-最终一致性

    我有以下场景 需要按照 CQRS 模式来实现 用户登录 用户输入一些保险详细信息 用户请求应用决定 用户查看决策结果 这看起来相当简单 但是我的问题是在步骤 3 和 4 之间 在步骤 3 中我发送了一个ApplyForDecision命令将
  • DDD 和 CQRS:从单个命令处理程序使用多个存储库?

    简单电子商店的典型示例 假设用户将一些商品添加到购物篮并单击 结账 发出 创建订单 命令 现在 在实际创建状态为 预计付款 的订单记录以及数据库中相应的订单行之前 我们必须检查用户选择的商品是否仍然可用 也许某些商品在用户将其添加到购物篮时
  • Mediatr - 无效/更新缓存的正确位置在哪里

    这个问题源于我问过太多接口 QCRS 和 Mediatr 库 请求 响应 的另一个问题 Mediatr 减少 DI 对象的数量 https stackoverflow com questions 53966361 mediatr reduc
  • 命令中的 CQRS 代码重复

    我有一个关于 CQRS 原则的命令端代码重复的问题 一直在关注以下文章 https www cuttingedge it blogs steven pivot entry php id 91 https www cuttingedge it
  • 有没有办法在触发 lambda 之前过滤 AWS DynamoDb Stream?

    因此 我们有几个 lambda 来监听数据库上的更改 在每个 lambda 中 我们必须在一开始就进行过滤 因为这个特定的 lambda 不关心所有更改 只关心特定的更改 更明确地说 我们正在应用事件源 并且 lambda 应该是事件处理程
  • 事件溯源基础设施实施

    我在我的应用程序中实现了事件源和 CQRS 模式 我的灵感来自于CQRS 旅程 https msdn microsoft com en us library jj554200 aspx我在哪里下载了示例代码 在那里 我找到了事件源的完整基础
  • 使用 void/Task 响应注册 MediatR 管道

    我的命令 public class Command IRequest 我的处理程序 public class CommandHandler IAsyncRequestHandler
  • CQRS 项目是否需要像 NServiceBus 这样的消息传递框架?

    过去 6 个月的学习曲线充满挑战 CQRS 和 DDD 是罪魁祸首 这很有趣 我们的项目已经完成了 1 2 我还没有时间深入研究的领域是消息传递框架 目前我不使用 DTC 因此如果我的读取模型未更新 那么很可能会出现读取和写入数据库之间的不
  • 使用 MediatR 时可以让一个处理程序调用另一个处理程序吗?

    或者这被认为是不好的做法还是什么 我有一个通知触发 4 5 个处理程序 这些处理程序依次调用数据库来检索数据 每个这些调用也可以单独调用 因此它们本身就是请求 处理程序 Thanks Jimmy Bogard mediatr 的作者 说你应
  • CQRS 事件溯源:验证用户名唯一性

    我们以一个简单的 账户注册 为例 流程如下 用户访问网站 点击 注册 按钮并填写表格 点击 保存 按钮 MVC 控制器 通过读取 ReadModel 来验证用户名的唯一性 RegisterCommand 再次验证用户名唯一性 这是问题 当然
  • 在 DDD/CQRS 中,ReadModel 是否应该充当 ViewModel,如果不是,那么映射的责任在哪里?

    假设读取模型ProductCatalogueItem由聚合 写入模型构建 与写入模型分开存储 并包含每个可供销售的产品 并具有以下属性 basics product code name price number of available s
  • 导入数据和事件溯源

    我目前正在开发一个整体系统 我希望将其引入现代并结合 DDD 和 CQRS 我收到了重新编写解决方案的导入机制的请求 并认为这可能是开始此重新架构过程的好机会 目前流程是 用户上传 CSV 系统解析 CSV 并在屏幕上显示每一行 对每一行以
  • CQRS 对于我的域是否正确?

    我正在对一个档案进行建模 它是视频点播系统的一部分 将存档想象成 Windows 资源管理器 其中多个用户可以创建文件夹 上传视频 重组文件夹等 有业务规则 权限 确定是否允许用户执行任务 即重命名文件夹 移动文件夹 查看文件夹等 我已将每
  • 事件源和 SQL Server 多个关系表

    我们使用 SQL Server 2016 的事件源 我们有完整的客户产品应用程序 每个应用程序都标记为CustomerId并在事件商店中获取单个指南行项目 这是写入事件存储指南的主要标识符 产品应用程序附带许多不同的关系事物 没有引导 但有
  • 缺失的事件如何重播?

    我正在尝试了解有关 CQRS 和事件溯源 事件存储 的更多信息 我的理解是 在这种情况下通常不使用消息队列 总线 消息总线可用于促进微服务之间的通信 但它通常不专门用于 CQRS 然而 我目前的看法是 消息总线将非常有用 可以保证读取模型最

随机推荐

  • App Store开发者重命名

    我有一个个人开发者帐户 而不是公司 我发布的每个应用程序附近都写有我的名字 现在我想把它改成一个漂亮的名字 而不改变我的开发者帐户 也不注册公司 任何帮助将不胜感激 我更改了已批准的答案 因为我们被迫启动所有法律程序来获取我们公司名称的合法
  • ant:警告:无法映射用于编码 UTF8 的字符

    我见过很多像我这样的问题 但他们没有回答我的问题 因为我使用的是 ant 而不是使用 eclipse 我运行这段代码 ant clean dist它多次告诉我warning unmappable character for encoding
  • 什么是 com.android.externalstorage?

    尽管这是一个简单的问题 但我找不到答案 or 堆栈溢出 https i stack imgur com 58Zv7 png 当我使用以下代码时 我得到这个结果 com android externalstorage documents tr
  • SSIS 将一张表中的所有数据导出到多个文件中

    我有一个名为 customers 的表 其中包含大约 1 000 000 条记录 我需要将所有记录传输到 8 个不同的平面文件 这会增加文件名中的数字 例如cust01 cust02 cust03 cust04 etc 有人告诉我这可以使用
  • 如何在 Android SDK 的 eclipse 中关闭 @string 资源的警告

    我知道 从技术上讲 对字符串进行硬编码并不是最佳实践 但我可以稍后处理它 现在我只想完成我的项目的外壳 并且我对代码中的警告非常强迫 有什么方法可以关闭它吗 如果我的标题不够具体 请以此为例
  • 何时在 Ninject 中停用瞬态范围对象?

    当 Ninject 中的对象与InTransientScope 该对象不会放入缓存中 因为它是 呃 瞬态的并且没有任何范围 完成该对象后 我可以调用kernel Release obj 这会传递到缓存 在缓存中检索缓存的项目并调用Pipel
  • 如何使用 SQL::Abstract 生成 SQL 查询?

    我如何生成WHERE此查询的子句使用SQL 摘要 http search cpan org perldoc SQL 3a 3aAbstract 从表中选择 COUNT 其中 id 第111章 111 1 2 3 4 AND 状态 待处理 包
  • 获取存储在sd卡+ android中的图像的缩略图Uri/路径

    SDK版本 1 6 我正在使用以下意图打开 Android 的默认图库 Intent intent new Intent intent setType image intent setAction Intent ACTION GET CON
  • 如何使用SimpleStorage插入xml prolog来生成gpx文件?

    我计划一劳永逸地采用一个方便的工具来处理 gpx 文件的创建 我相信简单存储 http www cromis net blog downloads simplestorage 这是一个OmniXML http www omnixml com
  • 无限 while 循环和 control-c

    所以 我写了下面的代码 void main void int charNums ALPHABET i 1 char word MAX while i initialize charNums word getString word setLe
  • 一种语言的编译器如何用该语言编写? [复制]

    这个问题在这里已经有答案了 可能的重复 在 自身 中实现编译器 https stackoverflow com questions 193560 implementing a compiler in itself 引导语言 https st
  • “self”关键字在类方法中是必需的吗?

    我是 python 初学者 我了解到该方法中的第一个参数应该包含一些 self 关键字 但我发现以下程序在没有 self 关键字的情况下运行 你能解释一下吗 下面是我的代码 class Student object def init sel
  • WPF 中的 StaticResource 和 DynamicResource 有什么区别?

    在 WPF 中使用画笔 模板和样式等资源时 可以将它们指定为 StaticResources
  • 如何使用Javascript来操作模态内容?

    我正在使用 bootstrap modals 和 Ruby on Rails 我能够很好地显示模式 但在使用 Javascript 操作模式内容时遇到问题 我不确定我做错了什么 但我根本无法使用 Javascript 来影响模态的内容 以至
  • Flutter - 使用正则表达式验证电话号码

    在我的 Flutter 移动应用程序中 我尝试使用以下方法验证电话号码regex 以下是条件 电话号码必须包含 10 位数字 如果我们使用国家代码 它可以是 12 位数字 示例国家代码 12 012 数字之间不允许有空格或字符 简而言之 这
  • Rbenv 未使用正确的版本

    在我的 Rails 项目中 当我尝试运行时bundle install 我收到以下错误 Your Ruby version is 2 3 7 but your Gemfile specified 2 5 3 然而 当我跑步时ruby ver
  • quarkus-arc 不满足依赖问题

    这是我的资源类 带有存储库注入 Path posts Produces MediaType APPLICATION JSON Consumes MediaType APPLICATION JSON public class PostsRes
  • 无法从资源 Books.hbm.xml 解析映射文档

    当我尝试使用 hibernate 将对象保存在数据库中时 为什么会出现 hibernate invalidmappingexception 书籍 hbm xml 在资源文件夹内
  • 如何使用 Bower 安装仓库的最新(未标记)状态?

    我有一个very小型仓库 我在主分支中完成所有开发工作 并使用标签作为历史中的 稳定 点 我想默认情况下 Bower 似乎会获取最新的tagged回购协议的版本 我正在尝试获取主分支中的最新提交 我尝试过以各种可以想象的顺序运行所有这些 b
  • 使用 CQRS 的读取端实现方法

    我已经转移到积极使用 CQRS 事件源的项目 乍一看它是按照所有这些书籍和博客来实现的 但最后我意识到实现中到底有什么问题 Here is CQRS architecture 这张照片最初是我从here http cre8ivethough