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

2023-12-24

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

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

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


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

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

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

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

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

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

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

EDIT:

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

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

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

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

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

    我目前正在设计一个新的企业系统 该系统的目的是跟踪 显示客户与公司的互动 即事件 并通知员工 使用事件源模式来保存所收集的所有客户交互 事件的分类帐似乎非常合适 因为我们所有其他域对象都源自事件流 然而 我看到一篇文章说基于事件源的整个系统
  • 在 CQRS 的写入端从数据库读取数据

    背景 Diagrams explaining CQRS usually will have clear separation of read and write paths and one way data flow like in thi
  • CQRS 事件不包含更新读取模型所需的详细信息

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

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

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

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

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

    当查看命令模式时 发现了细微的差异 也许有些人能够更清楚地说明这一点 当查看 Gang Of Four 时 它说每个命令都有一个Execute方法参见例如 http www blackwasp co uk Command aspx http
  • 命令中的 CQRS 代码重复

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

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

    我正在考虑使用 DDD CQRS EventSourcing 制作一个应用程序 但在弄清楚如何进行用户身份验证时遇到了一些麻烦 用户本质上是我的领域的一部分 因为他们对客户负责 我正在使用 ASP NET MVC 4 并且我希望只使用 Si
  • DDD 中两个限界上下文之间的通信

    我有几个不同的有界上下文在域中 CRUD 操作的验证是在每个限界上下文中构建的 例如 我可以仅当创建者是组长时才创建名为 GAME 的实体 在这个例子中我有两个有界上下文 BC 其一是Game BC另一个是User BC 为了解决这个问题
  • 使用 CQRS 和事件溯源时的唯一性验证

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

    我们的应用程序中基于 CRUD 的部分需要 离线双向 双向 同步 能够修改数据直到准备好然后 发布 审核日志 我正在寻找事件溯源 或 命令模式 来完成这些项目 我觉得用这个来解决 2 3 很舒服 但对于第一个项目同步还不清楚 如果每个命令都
  • CQRS - 如何对场景执行系统进行建模

    我最近开始为我即将启动的一个绿地项目研究 CQRS 和 DDD 我研究了 Udi Dahan Greg Young Mark Nijhof 等人的大量资料 这些确实非常有帮助 我想我对这些概念有了很好的理解 但是 我仍然有一些关于如何将这些
  • DDD 中哪一层应该包含查询

    我有一个简单的 DDD 服务 带有文章聚合根 我使用 MediatR 和 CQRS 来分离命令和查询 在 DDD 域中不应依赖于应用程序和基础设施层 我有一个存储库 IArticleRepository 用于从文章数据库中组合一些数据 我有
  • 事件源和 SQL Server 多个关系表

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

    请参阅下面我的第一个持久订阅 namespace PersistentSubscription internal class Program private static void Main var subscription new Per
  • 缺失的事件如何重播?

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

随机推荐

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

    我确实理解 完整的算法是一种如果有解决方案 该算法能够找到它的算法 而最佳算法是一种能够找到成本最低的解决方案的算法 但最优算法就是完整算法吗 可以简单解释一下吗 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 系统中命令和事件之间的区别 然而 有一种情况我想不通 假设我正在构建一个个人财务跟踪系统 用户可以在其中输入借方 贷方 显然 这些是命令 一旦经过验证 域模型就会更新并发布事件 然而 假设信用 借记信