使用 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 的读取端实现方法 的相关文章

  • 当领域事件发生时,谁对实体的突变负责? DDD

    我一直在学习CQRS ES 查看我经常看到的小示例项目改变实体状态的事件 例如 如果我们看一下Order 聚合根 public class Order AggregateRoot private void Apply OrderLineAd
  • 重构代码以避免反模式

    我有一个 BusinessLayer 项目 其中包含以下代码 域对象是FixedBankAccount 它实现了IBankAccount 存储库被制作为域对象的公共属性 并被制作为接口成员 如何重构它以使存储库不再是接口成员 域对象 Fix
  • 在 CQRS 中实现基于集合的约束

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

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

    我有以下场景 需要按照 CQRS 模式来实现 用户登录 用户输入一些保险详细信息 用户请求应用决定 用户查看决策结果 这看起来相当简单 但是我的问题是在步骤 3 和 4 之间 在步骤 3 中我发送了一个ApplyForDecision命令将
  • 如何在 CQRS/事件溯源中以确定性方式重放?

    在基于 CQRS ES 的系统中 您将事件存储在事件存储中 这些事件涉及一个聚合 并且它们相对于它们所属的聚合有一个顺序 此外 聚合是一致性 事务边界 这意味着任何事务保证仅在每个聚合级别上给出 现在 假设我有一个读取模型 它消耗来自的事件
  • 是什么导致 EventStore 这么容易抛出 ConcurrencyException?

    Using JOliver活动商店 http github com joliver EventStore3 0 并且刚刚开始使用简单的示例 我有一个使用 NServiceBus 的简单发布 订阅 CQRS 实现 客户端在总线上发送命令 域服
  • J Oliver EventStore V2.0 问题

    我正在着手使用 CQRS 实施一个项目 并打算使用 J Oliver EventStore V2 0 作为我的事件持久化引擎 1 在文档中 ExampleUsage cs在 BuildSerializer 中使用了3个序列化器 我想这只是为
  • 用于事件溯源的关系数据库架构

    我正在尝试将域事件存储在 postgres 数据库中 我对很多事情都不确定 而且我不想以后重新设计这个结构 所以我正在寻求有事件溯源经验的人的指导 我目前有下表 domain events version or event id integ
  • 事件溯源基础设施实施

    我在我的应用程序中实现了事件源和 CQRS 模式 我的灵感来自于CQRS 旅程 https msdn microsoft com en us library jj554200 aspx我在哪里下载了示例代码 在那里 我找到了事件源的完整基础
  • 使用 CQRS 和事件溯源时的唯一性验证

    我正在尝试使用事件源来实现我自己的 CQRS 基础设施 以更好地学习它 作为一个示例项目 我正在实现一个博客引擎 我知道它可能不是一个完美的选择 但我只想做一些真实的事情 我现在遇到的问题是验证 每个帖子都有一个shortUrl 以及sho
  • CQRS 事件溯源:验证用户名唯一性

    我们以一个简单的 账户注册 为例 流程如下 用户访问网站 点击 注册 按钮并填写表格 点击 保存 按钮 MVC 控制器 通过读取 ReadModel 来验证用户名的唯一性 RegisterCommand 再次验证用户名唯一性 这是问题 当然
  • CQRS、DDD同步报告数据库

    我们正在尝试 CQRS 和 DDD 以及事件溯源 假设我有一位客户更新了电子邮件地址 这会触发 CustomerUpdatesEmailAddress 事件 这会进入我的操作 写入数据库 并更新表 我们的系统设计为有一个运行的 ETL 流程
  • CQRS 对于我的域是否正确?

    我正在对一个档案进行建模 它是视频点播系统的一部分 将存档想象成 Windows 资源管理器 其中多个用户可以创建文件夹 上传视频 重组文件夹等 有业务规则 权限 确定是否允许用户执行任务 即重命名文件夹 移动文件夹 查看文件夹等 我已将每
  • 命令调度程序和中介器设计模式有什么区别?

    最近 我了解了命令调度程序模式 它可以帮助将命令与我们基于域驱动设计方法和 CQRS 模式的项目中的命令处理程序解耦 不管怎样 我把它与中介者设计模式混淆了 罗伯特 哈维已经回答了 https softwareengineering sta
  • 事件源和 SQL Server 多个关系表

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

    我有一个相当简单的域模型 涉及一系列Facility聚合根 鉴于我使用 CQRS 和事件总线来处理从域引发的事件 您如何处理集合的验证 例如 假设我有以下需求 Facility必须有一个唯一的名称 由于我在查询端使用最终一致的数据库 因此在
  • Axon 框架的现实生活体验[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 作为研究用于项目的 CQRS 的一部分 我遇到了轴突框架 http www axonframework org 我想知道是否有人有任何现实生活经
  • 使用 membus 和 ioc 容器的 SetHandlerInterface() 的多种类型

    过去此处演示 CQRS 代码 https gist github com hyrmn 3200053 raw 39ae14e4226d5e0d032690bf0e37e75286d2a1f7 EndToEndTests cs命令和事件处理程
  • 如何让CQRS适应项目? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我发现了一个新术语 名叫CQRS 命令查询职责分离 http martinfowler com bliki CQRS html其中指出 概念模型

随机推荐

  • 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