事件溯源命令或来自外部系统的事件?

2023-12-24

在大多数情况下,我了解 CQRS + ES 系统中命令和事件之间的区别。然而,有一种情况我想不通。

假设我正在构建一个个人财务跟踪系统,用户可以在其中输入借方/贷方。显然,这些是命令,一旦经过验证,域模型就会更新并发布事件。然而,假设信用/借记信息也直接来自外部系统,例如用户的花店发送一条消息,表示他已从用户的信用卡中收取了定期母亲节送货费用。在这种情况下,该消息看起来像是一个事件(收费已经发生),但该消息可能格式错误并且将被拒绝。那么这真的是一个命令吗?但是,需要有一种方法来发送 ACK/NACK,但这里的情况并非如此(花店只有在知道借记已发生后才会发送消息)。

编辑:只是为了澄清,我不是在谈论外部系统了解有关我的事件和/或命令的任何信息。我有一个组件从外部系统接收数据,然后必须发布事件或发送命令。问题是,我的组件应该使用事件或命令中的哪一个?


这是有界上下文的完美示例。

在代表相同或业务流程步骤的另一个系统(或有界上下文)中发生的事件不应被视为在接收系统中发生的事件。

花店系统借记事件可能具有与财务跟踪系统中发生的借记事件不同的结构。

为了解决这个问题,我将有一个端点来监听花店系统事件,然后我会让财务跟踪系统根据事件中的信息发出命令,如果需要的话,可能会将其与财务跟踪系统中的信息结合起来。发生这种情况的地方可以被视为财务跟踪系统的客户端,或者如果您愿意的话,甚至可以被视为“域服务”。

在这种特殊情况下,来自花店系统的事件带有花店系统(限界上下文)中发生的事务的信息。我不会在域服务中做出任何决策,而是向发生决策并可能发出财务跟踪系统事件的财务跟踪系统域发出命令。如果花店系统事件在财务跟踪系统中出现格式错误,您可能不想以请求/响应或 Ack/Nack 方式告知花店系统。该事件是从花店发布的,如果您实施类似的操作,就会破坏消息传递模式。您的消息传递基础设施应该允许您重试消息,甚至修复接收代码并使用新代码重试消息。

但是,如果您确实需要与 Florist 边界上下文进行通信,Florist 系统可以订阅来自财务跟踪系统的事件,以便查明事务是否已成功处理。仅当主系统决定是否发生交易时才需要这样做。

在您描述的情况下,财务跟踪系统更多的是事务日志,您唯一应该做的就是不要将花店事件视为财务跟踪系统事件。在发出导致财务跟踪系统事件的命令之间放置一些内容。

EDIT:

作为对您的编辑的回应。您的接收组件应将命令发送到财务跟踪系统域,该域反过来会发出事件(像往常一样)。

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

事件溯源命令或来自外部系统的事件? 的相关文章

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

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

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

    我使用 mysql 作为事件存储 因此 axon server connector 被排除在类路径之外 我的用例描述如下 Spring Boot 2 1 7 RELEASE 和 axon 4 3 2 我计划拥有三个数据库 分别用于轴突事件存
  • 从 CQRS 访问 Web 服务

    假设我有一个基于 CQRS 的系统 并且我的域需要来自外部 Web 服务的一些数据来做出决策 我如何正确建模 我可以想到两个选择 命令处理程序运行域逻辑 域本身调用 Web 服务 一旦获得响应 它将适当的事件附加到当前聚合并存储它们 该域基
  • 如何在 CQRS/事件溯源中以确定性方式重放?

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

    Using JOliver活动商店 http github com joliver EventStore3 0 并且刚刚开始使用简单的示例 我有一个使用 NServiceBus 的简单发布 订阅 CQRS 实现 客户端在总线上发送命令 域服
  • DDD 和 CQRS:从单个命令处理程序使用多个存储库?

    简单电子商店的典型示例 假设用户将一些商品添加到购物篮并单击 结账 发出 创建订单 命令 现在 在实际创建状态为 预计付款 的订单记录以及数据库中相应的订单行之前 我们必须检查用户选择的商品是否仍然可用 也许某些商品在用户将其添加到购物篮时
  • J Oliver EventStore V2.0 问题

    我正在着手使用 CQRS 实施一个项目 并打算使用 J Oliver EventStore V2 0 作为我的事件持久化引擎 1 在文档中 ExampleUsage cs在 BuildSerializer 中使用了3个序列化器 我想这只是为
  • Mediatr - 无效/更新缓存的正确位置在哪里

    这个问题源于我问过太多接口 QCRS 和 Mediatr 库 请求 响应 的另一个问题 Mediatr 减少 DI 对象的数量 https stackoverflow com questions 53966361 mediatr reduc
  • 如何确保最终一致的系统中客户端读取的一致性?

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

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

    我正在考虑使用 DDD CQRS EventSourcing 制作一个应用程序 但在弄清楚如何进行用户身份验证时遇到了一些麻烦 用户本质上是我的领域的一部分 因为他们对客户负责 我正在使用 ASP NET MVC 4 并且我希望只使用 Si
  • 使用 CQRS 和事件溯源时的唯一性验证

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

    我们的应用程序中基于 CRUD 的部分需要 离线双向 双向 同步 能够修改数据直到准备好然后 发布 审核日志 我正在寻找事件溯源 或 命令模式 来完成这些项目 我觉得用这个来解决 2 3 很舒服 但对于第一个项目同步还不清楚 如果每个命令都
  • 在 DDD/CQRS 中,ReadModel 是否应该充当 ViewModel,如果不是,那么映射的责任在哪里?

    假设读取模型ProductCatalogueItem由聚合 写入模型构建 与写入模型分开存储 并包含每个可供销售的产品 并具有以下属性 basics product code name price number of available s
  • 命令调度程序和中介器设计模式有什么区别?

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

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

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

    过去此处演示 CQRS 代码 https gist github com hyrmn 3200053 raw 39ae14e4226d5e0d032690bf0e37e75286d2a1f7 EndToEndTests cs命令和事件处理程
  • DDD - 跨有界上下文边界聚合根实体使用情况

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

随机推荐

  • 最优算法是完整算法吗?

    我确实理解 完整的算法是一种如果有解决方案 该算法能够找到它的算法 而最佳算法是一种能够找到成本最低的解决方案的算法 但最优算法就是完整算法吗 可以简单解释一下吗 Thanks 是的 根据定义 寻找最优解需要证明最优性 这可以通过找到所有解
  • 插入符号位置不跟踪?

    我想做的是将关键代码放入一个数组中 以便稍后做一些有趣的事情 因此 我捕获击键 获取插入符位置并将关键代码放入数组中 在 MooTools 的帮助下 var keyArray form addEvent keyup function eve
  • 从html表单的下拉框中获取选定的值而不提交

    如何从html表单的下拉框元素中获取所选项目的文本 使用Python 当我使用鼠标从下拉框中选择一项时 如何将值存储到变量中 即不使用提交按钮 这是针对我在仅支持 Python 的应用程序引擎中执行的应用程序 你的问题表明对如何进行一些误解
  • 为什么某些 xlims 和 ylims 在 ggplot 和 sf 中产生此错误?

    我正在学习使用 ggplot 和 sf 来处理空间数据 当我尝试绘制以下图时 出现错误 library sf library ggplot2 library rnaturalearth library rnaturalearthdata w
  • 如何将文件路径数组转换为分层 JSON 结构

    我正在尝试根据给定的所有文件和路径的数组创建机器目录结构的 JSON 该数组看起来像这样 string dirArray proc 15 task 15 exe proc 15 task 15 mounts mounts xml proc
  • Qt 的 Bullseye 代码覆盖率

    嘿 我面临着有关 Qt 的靶心代码覆盖率的问题 在我的 pro 文件中 我添加以下内容 QMAKE CC C Program Files x86 BullseyeCoverage bin cl QMAKE CXX QMAKE CC QMAK
  • Chrome 扩展:如何在同一选项卡中打开 popup.html 中的网址

    谷歌浏览器扩展程序 我为一件简单的事情而发疯 请不要责怪我 我不是英语出身 我很难阅读和理解所有扩展文档 我只想执行以下操作 我的 popop html 中有 8 个不同的 URL 当我点击右上角浏览器栏中的图标时 它会打开 网址 exam
  • Go 是否可以在不为每个外部进程启动一个操作系统线程的情况下生成并与外部进程通信?

    简洁版本 Golang 是否可以生成多个外部进程 shell 命令 在平行下 这样它就不会启动一个操作系统线程每个外部进程 并且在完成后仍然能够接收其输出 更长的版本 在 Elixir 中 如果使用端口 则可以生成数千个外部进程 而无需真正
  • 如何删除/修复幽灵工作区

    不知何故 我最终得到了一个 幽灵 工作空间 它不会显示在 Visual Studio 中的 管理工作区 下 当我连接到 VS Team Services 和开源控件资源管理器时 它会弹出一个错误对话框 其中包含 TF14061 工作区不存在
  • C++ 对字符文字的顺序有何保证?

    C 对字符文字的顺序有何保证 中的字符有一定的顺序吗基本源字符集 例如是 a lt z 保证是真的吗 怎么样 A lt z 该标准仅提供十进制数字排序的保证0 to 9 来自 C 11 标准草案部分2 3 lex charset 在源和执行
  • OpenCV Sift/Surf/Orb:drawMatch 函数无法正常工作

    我使用 Sift Surf 和 ORB 但有时我在使用 drawMatch 函数时遇到问题 这里的错误 OpenCV 错误 drawMatches 中断言失败 i2 gt 0 i2 0 i2 代码 drawMatchPoints img1
  • ISR 和函数调用之间的区别?

    我想了解ISR 中断服务例程 和函数调用之间的区别 我觉得从硬件角度来看 函数调用和 ISR 是相同的 如果我错了 请纠正我 我能找到的有关 ISR 和函数调用的所有信息如下 ISR 执行过程中随时可能发生的异步事件 该程序 将 PC 标志
  • 等待操作超时 Win32Exception (0x80004005): 等待操作超时 azure

    从 sql azure 检索大量数据时出现以下错误 我已经实现了瞬态故障处理 但仍然收到此错误 描述 执行当前 Web 请求期间发生未处理的异常 请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息 异常详细信息 System Comp
  • 使用 shellcode 进行缓冲区溢出练习

    我正在做一个关于 C 程序上的缓冲区过载的练习 这个问题的目标是在我将 shellcode 插入到程序中后获取 root shell 这是我到目前为止所拥有的 步骤 1 首先 让我们看看文件中的 C 代码file c root kali c
  • 自动创建 IIS 6.0 网站 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有 Web 应用程序门户 其中托管多个应用程序 每个应用程序都有自己的 IIS 网站 因此 每次我
  • 如何使用 NDK 19 在 OSX Darwin 上交叉编译适用于 64 位 Android 的 OpenSSL

    我之前问过基本相同的问题 不同的 NDK here https stackoverflow com questions 54537033 how to build openssl 1 1 1 for 64 bit android using
  • 在 Java 中合并 2 个 PDF

    我在使用 iText 以及将 2 个 PDF 合并为 1 个 PDF 时遇到问题 我想合并这个 PDF PDF1 一个站点 这是 PDF1 PDF2 一个站点 这是PDF2 我需要的 https dl dropboxusercontent
  • 为什么any 扩展X ? A : B 给 A |打字稿中的 B?

    type TestAny any extends a 1 2 gt 1 2 why how to understand type TestUnknown unknown extends a 1 2 gt 2 type TestStringA
  • ipython 中的括号匹配

    IPython 中是否有自动关闭方括号 引号 圆括号等的选项 我希望有一个与 gedit 插件类似的功能 根据建议 通过调整 inputrc 可以让应用程序 包括 IPython 使用 readline 在输入左括号时自动添加右括号here
  • 事件溯源命令或来自外部系统的事件?

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