NEventStore 重播事件的问题

2023-12-19

我们正在使用 CQRS + ES。 ES 是 NEventStore(以前称为 JOliver EventStore)。我们在不同的命令中有 2 个聚合。第二个 AR 的投影取决于读取模型中第一个 AR 投影写入的数据。问题是,当我们运行软件时,一切都进行得如此之快,以至于有时两个聚合会以相同的日期时间(CommitStamp 列)持久保存在事件存储中。重播事件时,我们从头开始按 CommitStamp 列排序。但是,如果两个流具有相同的 CommitStamp 并且以错误的顺序获取,则读取模型投影会出现异常。

知道如何解决这个问题吗?

===============================

这是github上关于这个问题的讨论https://github.com/NEventStore/NEventStore/issues/170 https://github.com/NEventStore/NEventStore/issues/170

===============================

EDIT:这就是我们目前重播事件的方式。我搜索了 GetFrom(...) 的工作原理,结果发现 commitstamp 列不用于排序。毕竟没有提交订单。因此,如果我开始重播事件,它可能会返回今天的事件,下一个 2 年前记录的事件,下一个等等

public void ReplayEvents(Action<List<UncommittedEvent>> whatToDoWithEvents, DateTime loadEventsAfterDate)
    {
        var eventPortion = store.Advanced.GetFrom(loadEventsAfterDate);

        var uncommitedEventStream = new UncommittedEventStream();
        foreach (var commit in eventPortion)
        {
            foreach (var eventMessage in commit.Events.ToList()))
            {
                uncommitedEventStream.Append(new UncommittedEvent(eventMessage.Body));
            }
        }
        whatToDoWithEvents(uncommitedEventStream.ToList());
    }

在NEventStore中,一致性边界是流。从版本 3.2 开始(正如 @Marijn 提到的,问题 #159 https://github.com/NEventStore/NEventStore/issues/159) CommitSequence 列用于在从所有持久性引擎的流中读取数据时对 CommitMessages(以及其中包含的 EventMessages)进行排序。

EventMessage 的排序是有保证的每个流基础。没有隐含的消息顺序across溪流。由于所选持久性引擎的某些方面而可能发生的任何实际排序都是偶然的,不得依赖。

保证跨流的排序将严重限制库的分布式友好方面。即使我们要考虑这样的功能,它也必须与所有支持的持久性引擎一起工作,其中包括 NoSQL 存储。

如果您正在实践领域驱动设计,其中每个流代表一个聚合根,并且您需要保证 2 个或更多聚合之间的排序,则这表明您的领域模型中存在设计问题。

如果您的投影需要合并来自多个源(流)的值,您可以依靠源内排序,但需要灵活地对源间排序。您还应该考虑重复消息的可能性,特别是当您通过外部总线或队列重放时。

如果您尝试使用时间戳 (CommitStamp) 在接收端重新排序多个流,这将是脆弱的。时间戳具有固定的分辨率(毫秒、刻度等)。即使只有一个作家,事情仍然可能“同时”发生。

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

NEventStore 重播事件的问题 的相关文章

  • Akka 持久化查询事件流和 CQRS

    我正在尝试在我的 ES CQRS 架构中实现读取端 假设我有一个这样执着的演员 object UserWrite sealed trait UserEvent sealed trait State case object Uninitial
  • 没有使用 SimpleInjector APIv3 注册类型 ICommandHandler

    我一直在使用 SimpleInjector 并尝试正确注册所有命令处理程序 这是我的代码 CQRS cs public interface ICommand public interface ICommandDispatcher void
  • 当领域事件发生时,谁对实体的突变负责? DDD

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

    我有一个 BusinessLayer 项目 其中包含以下代码 域对象是FixedBankAccount 它实现了IBankAccount 存储库被制作为域对象的公共属性 并被制作为接口成员 如何重构它以使存储库不再是接口成员 域对象 Fix
  • CQRS - 是否允许从写入端调用读取端?

    我开始阅读有关 CQRS 的内容 但我有点困惑 是否允许在写入端调用读取端来获取附加信息 http cqrs nu Faq command handlers http cqrs nu Faq command handlers在这里他们说这是
  • 在 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 访问 Web 服务

    假设我有一个基于 CQRS 的系统 并且我的域需要来自外部 Web 服务的一些数据来做出决策 我如何正确建模 我可以想到两个选择 命令处理程序运行域逻辑 域本身调用 Web 服务 一旦获得响应 它将适当的事件附加到当前聚合并存储它们 该域基
  • 订阅类别流,事件永远不会出现在订阅客户端中

    第一次使用获取事件存储 http geteventstore com阅读文档后 我遇到了一个问题 事件永远不会出现在我的订阅客户端上 由于我错过了一个配置步骤 这是可能的 拥有这个控制台应用程序客户端 public class EventS
  • CQRS-最终一致性

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

    简单电子商店的典型示例 假设用户将一些商品添加到购物篮并单击 结账 发出 创建订单 命令 现在 在实际创建状态为 预计付款 的订单记录以及数据库中相应的订单行之前 我们必须检查用户选择的商品是否仍然可用 也许某些商品在用户将其添加到购物篮时
  • Mediatr - 无效/更新缓存的正确位置在哪里

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

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

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

    我们以一个简单的 账户注册 为例 流程如下 用户访问网站 点击 注册 按钮并填写表格 点击 保存 按钮 MVC 控制器 通过读取 ReadModel 来验证用户名的唯一性 RegisterCommand 再次验证用户名唯一性 这是问题 当然
  • 命令调度程序和中介器设计模式有什么区别?

    最近 我了解了命令调度程序模式 它可以帮助将命令与我们基于域驱动设计方法和 CQRS 模式的项目中的命令处理程序解耦 不管怎样 我把它与中介者设计模式混淆了 罗伯特 哈维已经回答了 https softwareengineering sta
  • 使用流程管理器(又名 saga)在同一有界上下文中跨聚合根实现最终一致性

    假设您的有界上下文中有两个聚合 它们之间存在一些约束 使用 DDD 这些内部聚合约束不能在同一事务中强制执行 即聚合边界是事务边界 您是否会考虑使用 Microsoft CQRS 旅程中所谓的 流程管理器 来协调同一有界上下文中的两个聚合
  • CQRS/ES 世界中的报告

    我想我理解 ES CQRS 背景下的读取模型的想法 如果不明白请纠正我 然而 我对于在 严肃 报道的背景下使用它仍然有一些疑问 假设我使用关系数据库加上一些 ORM 来整理我的读取模型 一个基本的 摘要统计读取模型 可能如下所示 class
  • 使用 membus 和 ioc 容器的 SetHandlerInterface() 的多种类型

    过去此处演示 CQRS 代码 https gist github com hyrmn 3200053 raw 39ae14e4226d5e0d032690bf0e37e75286d2a1f7 EndToEndTests cs命令和事件处理程
  • 如何使用 J Oliver 的 EventStore 库?

    我一直在研究一个新项目的事件溯源 使用 J Oliver 的 EventStore 和 mongo 作为持久层 但遇到了一些问题 在尝试事件溯源之前 我的域持久保存到数据库 并且我一直在使用 Udi 的域事件pattern http www

随机推荐

  • C++奇怪的问题,未定义的引用

    出现错误 neljastest cpp 对 Vector2 Vector2 float float 的未定义引用 内尔贾斯特 cpp include
  • 注入 EntityManager 对比实体管理器工厂

    一个很长的问题 请耐心等待 我们正在使用 Spring JPA 来构建 Web 应用程序 我的团队正在争论注射问题EntityManagerFactory in the GenericDAO APPFUSE 提供的基于 Generics 的
  • 是否可以向凸起按钮添加自定义悬停颜色?

    在处理一个使用 Material UI 组件库的项目时 我收到了一个自定义按钮悬停颜色的请求 该颜色超出了 MUI 主题的正常约定 我在 凸起按钮 源代码中找到了这个相关的代码块 https github com callemall mat
  • Spark SQL 中的 INSERT IF NOT EXISTS ELSE UPDATE

    Spark SQL 中是否有执行 INSERT IF NOT EXISTS ELSE UPDATE 的规定 我有 Spark SQL 表 ABC 其中有一些记录 然后我有另一批记录 我想根据它们是否存在于该表中来插入 更新该表中 我可以在
  • Matplotlib imshow() 翻转 x 和 y 轴

    我在用着pyplot with matplotlib 我想将一些数据显示为图像 当我使用imshow 数据与我想要的查看方式翻转 我如何切换 x 轴和 y 轴imshow 或到numpy在我将其发送到之前的数组imshow 即我希望水平轴是
  • 如何在 Xcode 中的 CALayer 上方制作按钮或标签?

    在我的故事板中 我添加了一个按钮和一个标签 在我的 ViewController 中 我以编程方式定义了一个 CALayer 并将其作为子层添加到 ViewController 的视图中 当我测试应用程序时 子层位于按钮和标签上方 但我想将
  • 无法在 Fedora 上安装 GDB

    如何在 Fedora Linux 机器上下载并安装 GDB GNU 调试器 我尝试从 gnu 网站下载 7 1 包 但在安装过程中失败 configure然后make命令 请分享我可以获得相关信息的来源 Thanks 我发现这个教程可能对安
  • 如何实现一个具有一次读取 4 位节点的二进制 trie?

    我正在尝试找到一种方法inline某种意义上的二进制字典树 基本上 二进制 trie 为二进制数中的每个槽都有一个节点 在 0 上向左分支 在 1 上向右分支 您将如何构造它以便一次读取 4 位而不是 1 似乎每个 trie 节点中有 16
  • 记录 Xamarin 未处理(Android 未捕获)异常

    我想记录未处理的异常 但我看到关于是否以及如何可能实现的信息存在冲突 我了解 Xamarin 提出了AndroidEnvironment UnhandledExceptionRaiser or AppDomain CurrentDomain
  • 了解 Python ReportLab 中的表坐标系

    我无法理解坐标系ReportLab表格样式 根据他们的文档 每个命令的第一个元素是其标识符 第二个和第三个参数确定单元格 受负坐标影响的单元格的坐标 从 Python 索引中的限制值 坐标给出为 列 行 紧随其后 电子表格 A1 模型 但不
  • RabbitMQ 消息传递 - 初始化消费者

    我想使用 RabbitMQ 将对象的状态连续广播给可能正在侦听的任何消费者 我想对其进行设置 以便当消费者订阅时它将获取最后一个可用状态 这可能吗 使用自定义最后值缓存交换 例如https github com squaremo rabbi
  • 无法在 Mac OS 10.8 中从终端使用 svn 命令

    Team SVN 命令在终端中运行良好 我已经卸载并安装了最新版本的 svnclient 从那时起 我无法从我的 mac 终端访问 svn 命令 以下是我在终端中看到的错误消息 dyld 未加载库 opt local lib libssl
  • Clojure可以通过宏生成函数吗?

    我正在尝试通过宏生成 fn 但是我遇到了一个奇怪的问题 代码在这里 defmacro test2 lmk fn lmk2 println lmk lmk2 test2 12 13 gt Error defmacro test3 fn lmk
  • Cordova/PhoneGap 中的 Dropbox.js 身份验证

    我正在 Cordova PhoneGap 中编写一个应用程序 它尝试使用 Dropbox js 从 Dropbox 获取文件 Cordova 版本是 3 0 1 Dropbox js 版本是 0 10 0 我的 Javascript 在桌面
  • 有没有更好的方法使用Python的类型模块为复合类型创建类型别名? [复制]

    这个问题在这里已经有答案了 我有一个带有一个参数的函数 它应该采用int or a None作为论证 有多种方法可以为此类复合类型创建类型别名 test py import typing IntOrNone 1 typing TypeVar
  • popToRootViewControllerAnimated 无法正常工作

    我有一个导航应用程序 当发生某些错误时 我想将用户转回他们开始的视图 因此我在这些条件下执行以下代码 self navigationController popToRootViewControllerAnimated YES 当它执行时 根
  • MongoDB 中可以有多少个集合而不损失性能?

    我看到默认情况下 MongoDB 有 24 000 个可用集合 内存为 16MB ns文件 如果我将其增加到 2GB 最大值 我可以得到3 000 000数据库中的集合 性能会不会有大幅下降 根据文档 大量集合不会影响性能 几乎不会 拥有大
  • Android/Java - 日期差异天数

    我使用以下代码获取当前日期 格式为 12 31 1999 即 mm dd yyyy Textview txtViewData txtViewDate setText Today is android text format DateForm
  • 为什么 gcc 在 main 的开头推送 %rbx ?

    最新版本的 gcc 正在生成对我来说没有意义的程序集 我没有使用任何优化来编译代码 但是 即使没有优化 此代码的某些部分也没有意义 这是C源 include
  • NEventStore 重播事件的问题

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