CQRS 事件不包含更新读取模型所需的详细信息

2023-12-23

关于 CQRS 我不明白一件事:当引发的事件不包含更新读取模型所需的详细信息时,如何更新读取模型。

不幸的是,这是一种很常见的情况。

示例:我将用户添加到组,因此我发送 addUserToGroup(userId, groupId) 命令。该事件由命令处理程序接收、处理,创建、存储和发布 userAddedToGroup 事件。

现在,事件处理程序接收该事件和两个 ID。现在应该有一个视图,其中列出了所有用户及其所在组的名称。要更新该视图的读取模型,我们确实需要用户 ID(我们拥有)和组名称(我们不需要)没有,我们只有它的ID)。

所以问题是:我该如何处理这种情况?

目前,我想到了四种选择,每种选择都有其特定的缺点:

  1. 读取模型询问域。 => 禁止,甚至不可能,因为域只有行为,没有(公共)状态。

  2. 读取模型从读取模型中的另一个表读取组名称。 => 可以,但是如果没有匹配的表怎么办?

  3. 将必要的数据添加到事件中。 => 不起作用,因为这意味着我还必须更新所有以前的事件,并且我无法预见有一天我可能需要哪些数据。

  4. 不要通过“常规”事件处理程序处理事件,而是在后台启动 ETL 进程来处理事件存储、创建必要的数据并写入读取模型。 => 有效,但对我来说,对于这样一个简单的场景来说,这似乎有点太多的开销。

那么,问题是:我该如何正确处理这种情况?


有两种常见的解决方案。

1) “事件丰富”是指您确实在事件中添加反映您所提到的信息的信息,例如组名。这样做介于正确建模域和作弊之间。例如,如果您知道组名称发生了变化,那么在更改时发出名称并不是一个坏主意。想象一下,当您在报价单或发票上创建行项目时,您希望在发票创建事件中发出销售商品的价格。这是因为您必须遵守该价格,即使以后价格发生变化。

2) 同时投影多个流。编写一个投影仪来监视来自各种流的信息并将它们连接在一起。您可以观看用户和组事件以及添加到组事件的用户。根据系统中事件的顺序,您可能在知道组名称之前就知道用户位于组中,但在开始之前您应该知道事件存储的常规属性。

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

CQRS 事件不包含更新读取模型所需的详细信息 的相关文章

  • 将 CQRS 命令直接传递给域对象

    TLDR 我正在为我的一个较大的项目实现 CQRS DDD 解决方案 并且我想知道是否有任何真正的原因导致我的命令处理程序无法以较小的方式将命令对象直接分派到我的聚合在少数情况下 命令对象的数据丰富吗 我找不到任何具体原因说明为什么这是一种
  • 重构代码以避免反模式

    我有一个 BusinessLayer 项目 其中包含以下代码 域对象是FixedBankAccount 它实现了IBankAccount 存储库被制作为域对象的公共属性 并被制作为接口成员 如何重构它以使存储库不再是接口成员 域对象 Fix
  • NEventStore 重播事件的问题

    我们正在使用 CQRS ES ES 是 NEventStore 以前称为 JOliver EventStore 我们在不同的命令中有 2 个聚合 第二个 AR 的投影取决于读取模型中第一个 AR 投影写入的数据 问题是 当我们运行软件时 一
  • 在 CQRS 的写入端从数据库读取数据

    背景 Diagrams explaining CQRS usually will have clear separation of read and write paths and one way data flow like in thi
  • 事件溯源命令或来自外部系统的事件?

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

    我有一个关于 CQRS 架构上涉及多个聚合的投影的问题 例如 假设我有两个聚合WorkItem and Developer并且以下事件按顺序发生 但不是立即发生 工作项已创建 工作项Id WorkItemTitleChanged workI
  • DDD 和 CQRS:从单个命令处理程序使用多个存储库?

    简单电子商店的典型示例 假设用户将一些商品添加到购物篮并单击 结账 发出 创建订单 命令 现在 在实际创建状态为 预计付款 的订单记录以及数据库中相应的订单行之前 我们必须检查用户选择的商品是否仍然可用 也许某些商品在用户将其添加到购物篮时
  • 如何确保最终一致的系统中客户端读取的一致性?

    我正在深入研究 CQRS 并且正在寻找有关如何在最终一致的系统中解决客户端读取问题的文章 例如 考虑一个网上商店 用户可以将商品添加到购物车 如果命令 AddItemToCart 的实际处理是异步完成的 如何确保客户端显示购物车中的商品 我
  • 命令中的 CQRS 代码重复

    我有一个关于 CQRS 原则的命令端代码重复的问题 一直在关注以下文章 https www cuttingedge it blogs steven pivot entry php id 91 https www cuttingedge it
  • Mass Transit:当存在不同消息类型时确保消息处理顺序

    我是公共交通新手 我想了解它是否对我的情况有帮助 我正在构建一个使用 CQRS 事件源架构实现的示例应用程序 并且我需要一个服务总线 以便将命令堆栈创建的事件分派到查询堆栈反规范化器 假设我们的域中有一个聚合 我们称之为Photo 以及两个
  • 使用 CQRS 在 DDD 中进行命令验证

    我正在学习 DDD 并利用 CQRS 模式 我不明白如何在不从数据存储中读取的情况下验证命令处理程序中的业务规则 例如 克里斯想给阿什利一件礼物 该命令可能是 GiveGiftCommand 我什么时候才能验证克里斯确实拥有他想要赠送的礼物
  • 使用 void/Task 响应注册 MediatR 管道

    我的命令 public class Command IRequest 我的处理程序 public class CommandHandler IAsyncRequestHandler
  • CQRS 事件溯源:验证用户名唯一性

    我们以一个简单的 账户注册 为例 流程如下 用户访问网站 点击 注册 按钮并填写表格 点击 保存 按钮 MVC 控制器 通过读取 ReadModel 来验证用户名的唯一性 RegisterCommand 再次验证用户名唯一性 这是问题 当然
  • CQRS - 如何对场景执行系统进行建模

    我最近开始为我即将启动的一个绿地项目研究 CQRS 和 DDD 我研究了 Udi Dahan Greg Young Mark Nijhof 等人的大量资料 这些确实非常有帮助 我想我对这些概念有了很好的理解 但是 我仍然有一些关于如何将这些
  • 自动扩展 Axon 的跟踪事件处理器

    我使用 Axon 框架 4 0 3 和 Spring Boot 来进行事件溯源 并有一个跟踪处理器 该处理器配置为具有多个段 线程来同时处理事件 axon eventhandling processors my processor init
  • 命令调度程序和中介器设计模式有什么区别?

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

    我读过几篇关于 CQRS 的博客 它们都解释说 在写入端 事件会持久保存在事件存储中 并且根据请求 事件将被检索并聚合重播 我的问题是为什么读取端不需要聚合事件重播 因为您的读取端不使用聚合 读取端实现为投影 它根据聚合发出的事件流计算当前
  • CQRS/ES 世界中的报告

    我想我理解 ES CQRS 背景下的读取模型的想法 如果不明白请纠正我 然而 我对于在 严肃 报道的背景下使用它仍然有一些疑问 假设我使用关系数据库加上一些 ORM 来整理我的读取模型 一个基本的 摘要统计读取模型 可能如下所示 class
  • 偶尔连接的 CQRS 系统 - 客户端和服务器命令 - 基于任务的屏幕

    Premise 建议在CQRS DDD ES样式应用程序使用task基于屏幕 这些屏幕引导用户并捕获意图 These task屏幕也可以称为感应式用户界面 UI 设计指南的一些示例可以帮助您创建现代的 用户友好的应用程序 Microsoft
  • DDD - 跨有界上下文边界聚合根实体使用情况

    在域模型中对实体身份进行建模的一种建议方法是创建值对象而不是使用原始类型 例如在 C 中 public class CustomerId public long Id get set 在我看来 此类应该在整个应用程序中使用 而不仅仅是在域模

随机推荐

  • 我可以使用 s3cmd mv 命令将对象移动到 S3 存储桶内的“文件夹”中吗?

    我有s3cmd安装了Linux 的命令行工具 将文件放入存储桶中效果很好 但是 我想将文件移动到 文件夹 中 我知道 S3 本身不支持文件夹 但我的 Cyber duck GUI 工具可以很好地转换它们 以便我查看备份 例如 我在存储桶的根
  • NHibernate 左外连接不相关实体

    我有 2 个实体角色和翻译 角色 gt Role ID 代码翻译 gt 代码 语言 名称 这个想法是说对于某个角色 它有英文名 法文名等等 例如 Role 1 Rol 001 可以具有以下关系 Translation Rol 001 Eng
  • 可靠地停止无响应的线程

    我想知道如何停止 Java 中无响应的线程 使其真正死亡 首先 我很清楚Thread stop 已被弃用以及为什么不应使用它 关于这个主题已经有很多出色的答案 参见 1 https stackoverflow com questions 1
  • HTML 按钮调用控制器/操作

    我正在尝试在 Yii 中创建 html 按钮 点击按钮我想调用 UserController php 和 Actioncreate 我正在这样做 echo CHtml button Signup array button gt array
  • 如何调试在 Firefox (iOS) 上运行的网站?

    我正在寻找与使用 Safari 远程调试等效的方法来调试仅在 Firefox iOS 上发生的 JavaScript 边缘情况 对于这个项目 远程控制台就足够了 Thanks 如果其他人遇到这篇文章 在 Safari 开发工具中的 mac
  • 为什么 .add() 不在列中插入值?

    我正在尝试 sails js协会 using 单向参考 根据sails js 的实际应用书 现在 owner的值已成功插入owner列 但值在cars未插入列 当我尝试时console log foundDriver and console
  • 自提升脚本+执行策略

    我正在尝试使用问题中的以下代码 PowerShell 以管理员身份运行命令 https stackoverflow com questions 7690994 powershell running a command as administ
  • ZF2 字段集和表单绑定

    我正在尝试创建一个带有表单的页面 其中包含两个字段集 每个字段集应填充一个不同的表 我可以像相册教程中那样轻松创建一个表单 并像这样绑定数据 pageForm new PageForm pageForm gt bind page 我的 Pa
  • 如何将 EC2 负载均衡器与 AWS Lightsail 实例结合使用?

    我正在尝试在我的 AWS Lightsail 实例负载均衡器中安装通配符证书 但 Lightsail 实例不允许通配符证书 尽管 EC2 负载均衡器允许通配符证书 谁能解释一下如何将 EC2 负载均衡器与 Lightsail 实例结合使用
  • spring-boot - 有条件地在没有模板引擎的情况下提供静态内容

    我有一个静态页面 我想有条件地在特定 URL 上提供服务 使用 spring boot 我可以将页面放在static or public资源目录并将它们提供给每个人 但如果我想通过功能标志限制访问或禁用对它们的访问 那么这是不合适的 使用模
  • AngularJS:在指令内嵌入 ng-repeat

    我有一个指令 可以嵌入原始内容 对其进行解析 并使用原始内容中的信息来帮助构建新内容 它的要点如下 directive list function return restrict E transclude true templateUrl
  • 获取路由器出口外的路由数据

    有没有办法获得data组件中的参数是outisde路由器插座 const appRoutes Routes path component SitesComponent path pollutants newpollutant compone
  • 使用 hcitool 获取蓝牙连接的 RSSI,崩溃

    我读过很多关于获取蓝牙连接 RSSI 的可能性的 stackoverflow 帖子 看起来 Android 并没有通过任何 API 直接公开这一点 唯一的希望就是直接使用 bluez API 显然 一旦您与蓝牙设备建立连接 您就可以使用 h
  • 部署到 Springboot 应用程序后,Angular 路由不起作用

    我已经构建了一个 Springboot 应用程序 包括 Angluar5 我有一个 gradle 构建脚本 它将角度文件加载到我的 springboot 项目中 这些文件位于资源 静态我的 springboot 项目 当我启动我的应用程序时
  • 多个参数的 Lambda 表达式

    我理解 lambda 表达式本质上是一个内联委托声明 以防止额外的步骤 example delegate int Square int x public class Program static void Main String args
  • Java:如何将一个数组与另一个数组设置?

    我对 Java 很陌生 希望得到您的意见 所以 我有一个数组 String names Anna Jo String newNames Bob Sue Jane int totalLength names length newNames l
  • 如何构建 PHP/Node 代理在 https 网站上渲染外部 http 图像?

    我有一个正在运行的网站https 我必须从外部服务器 外部域 加载图像 该服务器没有 https 但只有一个http协议 有没有办法处理代理http通过 PHP 或 Node 获取图像 所以我可以像这样渲染图像 img src 这个想法是避
  • 使用 Python 请求登录 Instagram

    我正在尝试用 python 编写一个脚本来登录http insta friendorfollow com 并获取没有关注的人的列表 我想使用 请求模块 到目前为止我进行了多次尝试但没有成功 我的代码如下 import requests re
  • 将 Elasticsearch 从 1.4.3 迁移到 2.4 java 代码

    我正在从 Elasticsearch 1 4 3 迁移到 2 4 并且 替换了从弹性搜索文档引用的代码段 其他参考文献需要替换 andFilter 吗 Code TermQueryBuilder incPlatformFilter Quer
  • CQRS 事件不包含更新读取模型所需的详细信息

    关于 CQRS 我不明白一件事 当引发的事件不包含更新读取模型所需的详细信息时 如何更新读取模型 不幸的是 这是一种很常见的情况 示例 我将用户添加到组 因此我发送 addUserToGroup userId groupId 命令 该事件由