强制聚合之间不变量的最佳方法?

2024-03-06

处理聚合之间一致性的最佳方法是什么?以 Vaughn Vernon 书中的示例为例,您有 BacklogItem 聚合和 SprintAggregate。当 BacklogItemEvent 引发时,事件处理程序会捕获它并尝试更新 Sprint Aggregate。如果此操作失败怎么办?如何找到处理这种情况的最佳方法?据我了解有3个选择: 1) 更新一笔事务中的所有聚合。我们失去了可扩展性,但我们获得了一致性。 2)什么也不做。只需记录错误并等待手动干预。 3)使用传奇。这使设计变得复杂,并迫使我们实现每个用例,这些用例必须在单独的对象(saga)中的聚合之间强制执行变体。如果 Sprint 更新失败,saga 将尝试取消提交 Backlog 项目(补偿)。 您会选择哪个选项?您的标准是什么?


处理聚合之间一致性的最佳方法是什么?

如果您的聚合设计正确,那么您可以随着时间的推移处理聚合之间的“一致性”(也称为:最终一致性)。

如果此操作失败怎么办?

仔细阅读竞争条件不存在 http://udidahan.com/2010/08/31/race-conditions-dont-exist/;乌迪·达汉 (Udi Dahan) 认为协作域中的操作应该not fail.

更新一笔事务中的所有聚合。

你可以这样做;但这实际上意味着这两个实体实际上是一个实体的一部分implicit总计的。换句话说,它强烈表明您没有将聚合边界放置在正确的位置。

尝试在单个事务中修改多个聚合是有效的两阶段提交,以及由此产生的所有其他复杂情况。

没做什么。只需记录错误并等待手动干预。

是的;例如,参见;格雷格·杨有什么要说的.

使用传奇。这使设计变得复杂,并迫使我们实现每个用例,这些用例必须在单独的对象(saga)中强制聚合之间的不变量。

如今,您通常会看到“流程管理器”而不是“saga”,后者具有更具体的含义。但是,是的,如果域模型需要在聚合之间进行编排,那么您将需要在某处描述编排逻辑。

您可能想回顾一下 Rinat Abdullin 的讨论不断发展的业务流程 https://abdullin.com/post/ddd-evolving-business-processes-a-la-lokad/;他提出了一个很好的论点,即自动化只是复制人类操作员会采取的行动。

您会选择哪个选项?您的标准是什么?

比起容易,我更喜欢简单。因此,我的目标是异常报告,理由是(a)无论如何,这些失败应该很少见,所以我们不想在远离幸福道路的工作中投入大量设计资本,以及(b)如果我们系统中有失败的命令,那么我们应该有一个机制来报告失败的命令anyway,所以我只是利用现有的东西。

如果我时间紧迫,如果项目还没有足够成功,需要扩展,如果我手头没有所需的报告部分,我可能更愿意将更改潜入单个事务中,然后在开发过程本身中提出异常报告,以引起人们注意以后需要做更多工作的事实。

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

强制聚合之间不变量的最佳方法? 的相关文章

  • 关于 C# 的 AOP 的建议 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DDD:用户聚合根与其他聚合中几乎所有实体之间的一对多关系

    我有以下 DDD 场景 分为以下聚合 User 各位朋友 用户协会 文件 供用户上传 画廊 文件分组 消息 用户通信 群组 用户可以创建并且其他成员可以加入 GroupMessages 发送给组中所有成员的消息 群组论坛 群组成员可以讨论各
  • 使用 JPA/Spring 的(通用)DDD 存储库的方法:它看起来有问题吗?

    我对 DDD 和 JPA 还很陌生 我正在使用 JPA 和 Spring 开发一个通用存储库 我真的很喜欢文章中介绍的方法DDD 通用存储库 http codebetter com blogs gregyoung archive 2009
  • 存储库是单例还是静态还是都不是?

    我有一个 ASP NET 网站 它使用域驱动设计并使用存储库进行数据库操作 我想知道单例存储库和静态存储库以及每次访问都会新增的简单存储库类的优缺点是什么 此外 如果有人可以比较并指导我使用其中的哪一个 我将不胜感激 静态和单例对于存储库模
  • DDD - 使用 Doctrine 2 的有界上下文之间的关联映射

    我正在努力理解使用 Doctrine 2 实现来自不同有界上下文的两个实体之间的关联映射的正确方法 假设有两个 User 和 Post 实体分别属于 User 和 Content 有界上下文 内容 上下文中还有一个 用户 概念 它通过多对一
  • ASP.NET MVC Web 应用程序中视图逻辑和域逻辑之间的混淆

    我对域 应用程序逻辑和用户界面逻辑感到困惑 为了说明我想要确定的内容 我将在下面描述一个虚构的程序以供说明 1 想象一个带有一组 3 个级联下拉菜单的小型应用程序 当您选择一个下拉列表时 它会触发 jQuery Ajax GET 最终到达
  • 强制聚合之间不变量的最佳方法?

    处理聚合之间一致性的最佳方法是什么 以 Vaughn Vernon 书中的示例为例 您有 BacklogItem 聚合和 SprintAggregate 当 BacklogItemEvent 引发时 事件处理程序会捕获它并尝试更新 Spri
  • 值对象应该保存对实体的引用吗?

    值对象是否应该引用 DDD 方法中的实体 EDIT Dmitry 这大概就是我的情况 这里我附上类图 其中Account保留对集合的引用IInvoiceable项目 我治疗与Tenant作为实体 但它只拥有 1 个帐户 我不认为Accoun
  • .NET 中的 DDD / 聚合

    我一直在阅读 Evans 关于 DDD 的书 并且正在思考应该如何在 NET 中实现聚合 目前 我只能想出一种方法 将聚合隔离在单独的类库中 然而 这似乎有点矫枉过正 我更愿意将所有域对象保留在一个库中 我想知道是否有不同的方法 1 lib
  • BL 服务:异常还是方法结果?

    最好的方法是什么 为什么 V1 try var service IoC Resolve
  • 导入数据和事件溯源

    我目前正在开发一个整体系统 我希望将其引入现代并结合 DDD 和 CQRS 我收到了重新编写解决方案的导入机制的请求 并认为这可能是开始此重新架构过程的好机会 目前流程是 用户上传 CSV 系统解析 CSV 并在屏幕上显示每一行 对每一行以
  • 领域驱动设计和聚合参考

    我正在设计领域模型 但有些东西似乎不太好 我从一个主要的聚合开始 它引用了其他聚合 而其他聚合也引用了更多聚合 我可以从主聚合开始遍历孔域模型 我看到的问题是我将在内存中保存聚合的所有实例 这是一个好的设计吗 我可以通过延迟加载解决内存问题
  • 再次将服务注入域对象

    我有一个对地理数据进行操作的特定域 我正在 TypeScript 和 NodeJS 中实现这个项目 并有以下类 Point 包含纬度和经度的值对象 Area 包含点集作为形状定义的值对象 Sector 实体 它不是持久的 但它是可变的 包含
  • 在哪里检查用户电子邮件尚不存在?

    我有一个帐户对象 可以像这样创建用户 public class Account public ICollection
  • 使用 JPA 实体作为域模型是一个好习惯吗?

    或者创建一个由域模型组成的域层并与 JPA 实体对话以进行数据库访问 两种方法的优缺点是什么 谢谢 这确实取决于您对域进行编码的方式 一般来说 在 Java 中 我更喜欢创建一组单独的 JPA 注释的 DTO 来处理持久性 此类 DTO 将
  • 存储库本身通常不经过测试?

    抱歉 我对存储库模式 单元测试和 orm 工具还不熟悉 我一直在研究单元测试和存储库模式 并得出一些结论 我想知道我是否正确 存储库模式有助于在使用它的控制器中替换单元测试 例如 对吧 因为创建上下文 在 EF 中 或会话 在 NH 中 的
  • CQRS - 读取端的事件重播

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

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

    我正在考虑开发一个具有明确定义域的系统 主要基于网络 域的一部分包括像这样的实体Diary Booking Customer etc 不过我创建了另一个名为User其目的仅用于身份验证和授权 污染Customer具有特定于身份验证的数据的实
  • 缺失的事件如何重播?

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

随机推荐

  • 超级开发模式重新编译后未检测到更改

    我设置了新的 Eclipse 工作区并从 SVN 下载了项目 我启动了超级开发模式 gwt 2 7 0 chrome 浏览器 当尝试重新编译时 它显示 跳过编译 因为没有输入文件已更改 它在旧工作区中运行良好 但在新工作区中则不然 我使用相
  • Laravel 与数据表:搜索加密数据

    我在使用 Laravel 数据表时遇到了一个很大的问题 我有一个模型 它有 3 个由 setter getter 自动加密 使用 Crypt 的值 我正在使用数据表来渲染表格 return datatables gt of Patient
  • 如何使用 HTML5 将网络摄像头捕获的 jpg 图像/视频保存在本地硬盘中

    问题看似简单 但我找不到合适的解决方案 因为我缺乏 HTML 和 Javascript 知识 任务只是设计一个网页 其中的按钮将激活网络摄像头并将静态图像或视频 最好 存储在本地硬盘驱动器中 暂时不需要上传 下载 经过一番尝试 我可以使用
  • Intellij-idea 反向粘贴到字符串中(又名从字符串复制)?

    在 Intellij idea 中 如果您将一些文本粘贴到字符串文字中 在双引号之间 java 编辑器可以自动重新格式化粘贴的文本 即为双引号新行等放置必要的转义字符 我想做相反的事情 即当从字符串文字内部复制文本时 编辑器将干净的文本放置
  • 使用 Lambda 代理集成的 Step Functions 和 Lambda

    我编写了一堆 Lambda 函数 这些函数通过 API Gateway 作为 Rest 端点公开 我选择了 Lambda 代理集成 因为它似乎是一种简单的入门方法 现在我想通过 AWS Step Functions 将其中 2 个函数链接在
  • C# 中的隐式数组转换

    我有以下定义了隐式转换运算符的类 class A class B private A m a public B A a this m a a public static implicit operator B A a return new
  • 谷歌地图获取半径

    我在使用这个谷歌地图 javascript 代码时遇到了愚蠢的困难 我想返回在谷歌地图上生成的圆的半径 Google API 提供了代码 但我不知道把它放在哪里 我到处都试过了 这是下面的代码 我做错了什么
  • java中多级继承中构造函数调用的顺序[重复]

    这个问题在这里已经有答案了 c07 Sandwich java Order of constructor calls package c07 import com bruceeckel simpletest import java util
  • spring错误没有JdbcTemplate类型的合格bean

    我有一个正在创建的 Spring Boot 应用程序Datasource and JdbcTemplate手动在我的配置中 因为我需要解密数据源密码 我正在使用 tomcatDataSource org apache tomcat jdbc
  • PUT 请求中的 100-Continue 是什么意思?

    我在某些 PUT 请求 上传文件 中看到 Expect 100 continue 这是什么意思 应该发生的情况是 您应该发送带有以下内容的请求标头 Expect 100 continue 标头 然后 在发送标头之后 发送有效负载之前 您应该
  • Xcode Beta3 中的 CMutablePointer 和 CConstPointer 发生了什么?

    Xcode Beta3 中的 CMutablePointer 和 CConstPointer 发生了什么 在 Beta2 中成功编译的代码失败并出现错误 Use of undeclared type CMutablePointer 分别使用
  • SetConsoleCtrlHandler例程问题

    我正在用 C 编写一个控制台应用程序 我使用 SetConsoleCtrlHandler 来捕获关闭和 CTRL C 按钮 这允许我的所有线程正确停止和退出 其中一个线程执行一些需要一些时间才能完成的保存 并且我有一些代码需要在控制台 cr
  • 动态函数列表并动态调用它们

    我希望能够将各种静态方法存储在列表中 然后查找它们并动态调用它们 每个静态方法都有不同数量的参数 类型和返回值 static int X int int static string Y int int string 我想要一个可以将它们全部
  • 如何在Android中获取远程设备自定义蓝牙名称?

    我想在 Android 中检索远程蓝牙设备的自定义名称 我说的是在 设置 蓝牙 和配对设备下的手机设置中找到的名称 例如 我有一个名为 DoorControl 的远程蓝牙设备 在 设置 gt 蓝牙 gt 配对设备 下 我已将设备重命名为 C
  • 为什么以及何时创建多模块 Maven 项目?

    我有一个关于 Maven 多模块项目的一般性问题 何时以及为什么要这样做 Esko Luontola 的回答 将项目拆分为多个模块很有用 例如 这些模块需要单独部署 可能会被误解 如果您有要单独部署的模块 则情况恰恰相反 在这种情况下 您永
  • 尝试让网络错误警报显示在 iPhone 应用程序上?

    好的 我正在尝试让这个应用程序显示网络错误警报代码 我添加了 SystemConfiguration framework 框架和 Apple 的 Reachability 示例代码 这是 viewcontroller h 文件 import
  • 使用一个查询更新多行?

    我在这里发现了一些可以更新一个字段的东西 http www karlrixon co uk articles sql update multiple rows with Different values and a single sql q
  • 将空格分隔的条目拆分为 R 中的新列

    我正在编写一项输出 csv 文件的调查 在此 csv 中 我有一些以空格分隔的条目 它们代表多选问题 例如具有多个答案的问题 最后 我想将这些空格分隔的条目解析到它们自己的列中 并为它们创建标题 这样我就知道它们来自哪里 例如 我可以从此开
  • MongoDB 将两个数组内的值相乘

    我需要帮助将对象数组中的值相乘以获得输出 这是我的 JSON 1 id ObjectId 5b919a785cb288f7d5311846 nome Antonio cod produtor PR001 morada rua Rua dos
  • 强制聚合之间不变量的最佳方法?

    处理聚合之间一致性的最佳方法是什么 以 Vaughn Vernon 书中的示例为例 您有 BacklogItem 聚合和 SprintAggregate 当 BacklogItemEvent 引发时 事件处理程序会捕获它并尝试更新 Spri