如何在 CQRS/事件溯源中以确定性方式重放?

2023-12-30

在基于 CQRS / ES 的系统中,您将事件存储在事件存储中。这些事件涉及一个聚合,并且它们相对于它们所属的聚合有一个顺序。此外,聚合是一致性/事务边界,这意味着任何事务保证仅在每个聚合级别上给出。

现在,假设我有一个读取模型,它消耗来自的事件multiple聚合(据我所知,这完全没问题)。为了能够以确定性的方式重播读取模型,事件需要某种跨聚合的全局排序 - 否则您将不知道是否在 B 的事件之前或之后重播聚合 A 的事件,或者如何混合他们。

实现此目的的最简单的解决方案是在事件上使用时间戳,但通常时间戳不够细(或者,换句话说,并非所有数据库都是一样的)。另一种选择是使用全局序列,但这在性能方面很差并且阻碍扩展。

你如何解决这个问题?或者我的基本假设是,读取模型的重播应该是确定性的,是错误的吗?


我看到这些选项:

  • 全局序列

    • 如果你的数据库允许,你可以使用timestamp+aggregateId+aggregateVersion作为索引。这通常在分布式数据库情况下效果不佳。

    • 在分布式数据库中您可以使用矢量时钟 https://en.wikipedia.org/wiki/Vector_clock无需锁定即可获取全局序列。

  • 每个读取模型内的事件序列。您可以将所有事件存储在读取模型中,并在应用投影函数之前根据需要对它们进行排序。

  • 允许非决定论并处理它。例如,在您的示例中,如果 add_user 事件到达时没有组 - 只需在读取模型中创建一个空组记录并添加用户。当 create_group 事件到达时 - 更新该组记录。 毕竟,您已经签入了 UI 和/或命令处理程序 是一个具有该aggregateId的组,对吧?

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

如何在 CQRS/事件溯源中以确定性方式重放? 的相关文章

  • NEventStore 重播事件的问题

    我们正在使用 CQRS ES ES 是 NEventStore 以前称为 JOliver EventStore 我们在不同的命令中有 2 个聚合 第二个 AR 的投影取决于读取模型中第一个 AR 投影写入的数据 问题是 当我们运行软件时 一
  • CQRS 事件不包含更新读取模型所需的详细信息

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

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

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

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

    Using JOliver活动商店 http github com joliver EventStore3 0 并且刚刚开始使用简单的示例 我有一个使用 NServiceBus 的简单发布 订阅 CQRS 实现 客户端在总线上发送命令 域服
  • GOF 与 CQRS 中命令模式的含义

    当查看命令模式时 发现了细微的差异 也许有些人能够更清楚地说明这一点 当查看 Gang Of Four 时 它说每个命令都有一个Execute方法参见例如 http www blackwasp co uk Command aspx http
  • 用于事件溯源的关系数据库架构

    我正在尝试将域事件存储在 postgres 数据库中 我对很多事情都不确定 而且我不想以后重新设计这个结构 所以我正在寻求有事件溯源经验的人的指导 我目前有下表 domain events version or event id integ
  • 命令中的 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 应该是事件处理程
  • Mass Transit:当存在不同消息类型时确保消息处理顺序

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

    我有几个不同的有界上下文在域中 CRUD 操作的验证是在每个限界上下文中构建的 例如 我可以仅当创建者是组长时才创建名为 GAME 的实体 在这个例子中我有两个有界上下文 BC 其一是Game BC另一个是User BC 为了解决这个问题
  • 使用 MediatR 时可以让一个处理程序调用另一个处理程序吗?

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

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

    是否可以在没有 Axon Server 的情况下扩展 Axon Framework企业 我有兴趣使用 Axon 创建原型 CQRS 应用程序 但最终的可部署系统必须免收许可费用 如果 Axon Framework 无法使用免费软件扩展到六个
  • 在 DDD/CQRS 中,ReadModel 是否应该充当 ViewModel,如果不是,那么映射的责任在哪里?

    假设读取模型ProductCatalogueItem由聚合 写入模型构建 与写入模型分开存储 并包含每个可供销售的产品 并具有以下属性 basics product code name price number of available s
  • EventSourced Saga 实施

    我已经编写了一个事件源聚合 现在实现了一个事件源传奇 我注意到两者是相似的 并创建了一个事件源对象作为两者派生的基类 我在这里看过一个演示http blog jonathanoliver com cqrs sagas with event
  • 命令调度程序和中介器设计模式有什么区别?

    最近 我了解了命令调度程序模式 它可以帮助将命令与我们基于域驱动设计方法和 CQRS 模式的项目中的命令处理程序解耦 不管怎样 我把它与中介者设计模式混淆了 罗伯特 哈维已经回答了 https softwareengineering sta
  • Axon 框架的现实生活体验[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 作为研究用于项目的 CQRS 的一部分 我遇到了轴突框架 http www axonframework org 我想知道是否有人有任何现实生活经
  • 偶尔连接的 CQRS 系统 - 客户端和服务器命令 - 基于任务的屏幕

    Premise 建议在CQRS DDD ES样式应用程序使用task基于屏幕 这些屏幕引导用户并捕获意图 These task屏幕也可以称为感应式用户界面 UI 设计指南的一些示例可以帮助您创建现代的 用户友好的应用程序 Microsoft

随机推荐