缺失的事件如何重播?

2024-05-14

我正在尝试了解有关 CQRS 和事件溯源(事件存储)的更多信息。

我的理解是,在这种情况下通常不使用消息队列/总线——消息总线可用于促进微服务之间的通信,但它通常不专门用于 CQRS。然而,我目前的看法是,消息总线将非常有用,可以保证读取模型最终同步,从而实现最终一致性,例如当托管读取模型数据库的服务器重新联机时。

据我了解,CQRS 通常可以接受最终一致性。我的问题是;读取端如何知道它与写入端不同步?例如,假设每天在事件存储中创建了 2,000,000 个事件,并且有 1,999,050 个事件也写入了读取存储。剩余的 950 个事件没有被写入,因为某个地方的软件错误或者因为托管读取模型的服务器离线了几秒钟等。最终一致性在这里如何发挥作用?应用程序如何知道重播一天结束时丢失的 950 个事件或由于 10 分钟前的停机而丢失的 x 个事件?

我在过去一周左右的时间里读过这里的问题,其中讨论了从事件存储中重播的消息,例如这个:CQRS - 读取端的事件重播 https://stackoverflow.com/questions/32818395/cqrs-event-replay-for-read-side,但是没有人谈论这是如何完成的。我是否需要设置每天运行一次并重播自计划任务上次成功之日起创建的所有事件的计划任务?有更优雅的方法吗?


根据需求,我在项目中使用了两种方法:

  1. 同步、进程中阅读模型。事件被持久化后,在相同的请求生命周期内,在相同的进程中,Readmodels 将被提供这些事件。如果 Readmodel 失败(错误或可捕获的错误/异常),则会记录错误,并且会跳过 Readmodel,并向下一个 Readmodel 提供事件等。然后遵循 Sagas,这可能会生成生成更多事件的命令,并重复该循环。

当业务可以接受 Readmodel 失败的影响时,当 Readmodel 数据的准备情况比失败风险更重要时,我会使用这种方法。例如,他们希望数据立即在 UI 中可用。

错误日志应该可以在某些管理面板上轻松访问,以便在客户端报告写入/命令和读取/查询之间不一致的情况下有人会查看它。

如果您的 Readmodel 相互耦合,即一个 Readmodel 需要来自另一个规范 Readmodel 的数据,这也适用。虽然这看起来很糟糕,但事实并非如此,这总是要看情况。在某些情况下,您需要用弹性来交换更新程序代码/逻辑重复。

  1. 异步,在另一个进程中读取模型更新程序。当我将 Readmodel 与其他 Readmodel 完全分离时,即 Readmodel 的失败不会导致整个读取端崩溃时,就会使用此方法;或者当 Readmodel 需要另一种不同于整体的语言时。基本上这是一个微服务。当 Readmodel 内部发生不良情况时,有必要通知一些权威的更高级别组件,即通过电子邮件或短信或其他方式通知管理员。

Readmodel 还应该有一个状态面板,其中包含有关它已处理的事件的各种指标、是否存在间隙、是否存在错误或警告;它还应该有一个命令面板,管理员可以随时重建它,最好不要系统停机。

在任何方法中,读取模型都应该易于重建。

您如何选择拉式方法和推式方法?您会使用带有推送(事件)的消息队列吗

我更喜欢基于拉动的方法,因为:

  • 它不使用另一个有状态组件,例如消息队列,另一个必须管理的组件,它会消耗资源并且可能(因此会)失败
  • 每个 Readmodel 以它想要的速率消耗事件
  • 每个 Readmodel 都可以随时轻松更改其消耗的事件类型
  • 通过从一开始请求所有事件,每个 Readmodel 都可以随时轻松重建
  • 事件的顺序与事实的来源完全相同,因为你从事实的来源中提取信息

在某些情况下我会选择消息队列:

  • 即使事件存储不存在,您也需要事件可用
  • 你需要竞争/平行的消费者
  • 您不想跟踪您消费了哪些消息;当它们被消耗时,它们会自动从队列中删除
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缺失的事件如何重播? 的相关文章

  • 领域驱动设计和 IoC/依赖注入

    我现在正在尝试应用我学到的有关 DDD 的知识 但我对域模型中的依赖关系流有点困惑 我的问题是 实体是否应该了解域中的工厂 存储库 服务 存储库应该了解域中的服务吗 另一件困扰我的事情是当我想向集合添加实体时如何处理集合 假设我正在开发一个
  • 为什么域模型不应该用作 REST API 中的资源?

    我遇到过这样一种说法 按照 DDD 设计的领域模型不应该用作 REST API 中的资源 source https www thoughtworks com insights blog rest api design resource mo
  • 如何解决客户端-服务器应用程序中的无状态问题?

    我读过一些有关创建无状态网站的书籍 也读过一些有关有状态客户端应用程序的书籍 但是当您必须将两者结合起来时 就会出现很多复杂性 我们有一个 Flex 应用程序 需要通过 NET 服务将数据保存到数据库中 需要记住的事情是 并发 乐观 悲观
  • 使用 DDD 方法在 Python 中保留 POJO

    我正在尝试使用 DDD 模式创建 Flask 应用程序 DDD 的核心原则之一是将领域与持久性 基础设施 分离 我已在模块中定义了域模型 并将在基础设施模块中创建存储库 但是 我似乎找不到任何关于如何在 Python 中持久保存 POJO
  • 如何定义分层数据结构的DDD聚合根?

    我目前正在尝试将领域驱动设计原则应用于我的开发实践 我一直致力于如何为按层次结构组织的数据定义聚合根 我们以文件夹结构为例 每个文件夹可以有 0 N 个子文件夹 子文件夹 0 N 也可以有 0 N 个子文件夹 依此类推 我对文件夹及其所有直
  • 领域驱动设计和聚合参考

    我正在设计领域模型 但有些东西似乎不太好 我从一个主要的聚合开始 它引用了其他聚合 而其他聚合也引用了更多聚合 我可以从主聚合开始遍历孔域模型 我看到的问题是我将在内存中保存聚合的所有实例 这是一个好的设计吗 我可以通过延迟加载解决内存问题
  • 自动扩展 Axon 的跟踪事件处理器

    我使用 Axon 框架 4 0 3 和 Spring Boot 来进行事件溯源 并有一个跟踪处理器 该处理器配置为具有多个段 线程来同时处理事件 axon eventhandling processors my processor init
  • 实现领域驱动设计的函数式方法

    我在使用 C 编写领域驱动应用程序方面拥有丰富的经验 我编写的应用程序越多 我就越发现我想要采用一种不太适合标准 C OO 技术的方法 我想编写尽可能多的纯函数 因为它们真的很容易测试 我想以更具声明性的方式编写我的业务逻辑 所以我一直在研
  • 首先是 DDD 数据库。如何处理聚合

    我正在尝试学习 DDD 的概念 我做了一个项目 我使用数据库优先方法 在基础设施中 我添加了一个 edmx 文件 我选择自动生成实体 现在在 域 中我正在尝试创建聚合 但在这里我遇到了一些问题 我正在尝试创建一个名为 User 的聚合 但
  • 涵盖 .NET 中的 TDD、DDD 和设计模式的书籍

    我想要一本能够真正让我全面了解使用 C TDD ASP NET MVC DDD 和设计模式 例如存储库模式 的现代 ASP NET 开发的书 我非常擅长 C 和 ASP NET MVC 但想填补空白 如果您对涵盖这些主题的一两本书有很好的体
  • 实体框架:获取存储库中的子类对象

    我有与下面列出的数据库表对应的以下模型 经理就是雇员 会计师也是雇员 让所有管理器都进入存储库的最佳方法是什么 如何实现GetAllManagers 方法 这是正确的TPT吗 CODE MyRepository MyEmployeeRepo
  • 事件源和 SQL Server 多个关系表

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

    我有一个相当简单的域模型 涉及一系列Facility聚合根 鉴于我使用 CQRS 和事件总线来处理从域引发的事件 您如何处理集合的验证 例如 假设我有以下需求 Facility必须有一个唯一的名称 由于我在查询端使用最终一致的数据库 因此在
  • 身份验证和用户任务

    我正在考虑开发一个具有明确定义域的系统 主要基于网络 域的一部分包括像这样的实体Diary Booking Customer etc 不过我创建了另一个名为User其目的仅用于身份验证和授权 污染Customer具有特定于身份验证的数据的实
  • CQRS/ES 世界中的报告

    我想我理解 ES CQRS 背景下的读取模型的想法 如果不明白请纠正我 然而 我对于在 严肃 报道的背景下使用它仍然有一些疑问 假设我使用关系数据库加上一些 ORM 来整理我的读取模型 一个基本的 摘要统计读取模型 可能如下所示 class
  • 在下面的模型中,地址不应该是值对象吗?

    From 值对象如何存储在数据库中 https stackoverflow com questions 679005 how are value objects stored in the database 假设公司和个人都有相同的邮件地址
  • 使用 membus 和 ioc 容器的 SetHandlerInterface() 的多种类型

    过去此处演示 CQRS 代码 https gist github com hyrmn 3200053 raw 39ae14e4226d5e0d032690bf0e37e75286d2a1f7 EndToEndTests cs命令和事件处理程
  • 领域驱动设计和工厂类的作用

    我不清楚工厂类的角色和职责是什么 我知道工厂类应该负责创建域对象 聚合根 及其关联的实体和值对象 但我不清楚 DDD 架构的工厂 层 在哪里 工厂应该直接调用存储库来获取其数据还是服务库 工厂在以下框架中的位置 UI gt 应用程序 gt
  • 偶尔连接的 CQRS 系统 - 客户端和服务器命令 - 基于任务的屏幕

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

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我发现了一个新术语 名叫CQRS 命令查询职责分离 http martinfowler com bliki CQRS html其中指出 概念模型

随机推荐