gpt4 book ai didi

events - DDD 使用 NoSQL 处理限界上下文中多个聚合的最终一致性

转载 作者:可可西里 更新时间:2023-11-01 11:12:37 26 4
gpt4 key购买 nike

我目前正在开发一个 DDD 地理定位应用程序,它在一个有界上下文中有两个独立的聚合根。由于坐标更新频繁,我使用 Redis 来保存不允许回滚的数据。

  1. 我的第一个聚合根是一个行程对象,包含司机(用户)、乘客(用户列表)等。
  2. 我的第二个聚合根是用户位置更新

发送坐标更新时,我将生成并触发“UpdateUserPostionEvent”。作为副作用,我还会在特定点生成并触发“UpdateTripEvent”,这将更新司机/乘客的坐标。

我的问题是,如果我异步触发“UpdateLiveTripEvent”,我该如何处理最终一致性。我的 UpdateLiveTripEventHandler 有几个故障点,除了记录错误外,我该如何处理这种不一致?

我正在使用一个名为 MediatR 的库据我所知,INotificationHandler 是“即发即弃”

编辑: 最终找到了这个 SO post准确描述了我需要的东西(saga/process manager),但不幸的是我无法在同一个 BC 中找到任何类型的 Saga 实现来处理事件。我看到的所有示例都涉及服务总线。

最佳答案

相同或不同的限界上下文;有或没有传奇;没关系。

为什么事件处理失败?领域规则或基础设施。

域规则:由聚合处理的引发事件(事件处理程序使用聚合来应用事件)不应因域规则而失败。

如果“目标”聚合具有拒绝事件的域规则,则您的聚合设计是错误的。命令/操作可以被域规则拒绝。域规则不能拒绝(或撤消)事件。

当“来源”聚合检查了此操作的所有域规则时,应引发一个事件。 “目标”聚合应用事件并可能引发另一个事件,其中包含由“目标”聚合计算的某些值(域规则,但不是用于拒绝事件;域规则不能拒绝事件;但要“继续”一致性“链"具有良好的责任分离)。这就是为什么事件应该以过去的句子作为名称的原因;因为已经发生了。

事件模拟:

  • Agg1:嘿伙计们!用户做了这件很酷的事,一切似乎都很好。 --> UserDidThisCoolThingEvent
  • Agg2:哇哈,太棒了!我要在用户点数中加 3。 --> UserReceivedSomePointsEvent
  • Agg3:给这个用户 +3 分?用户刚刚达到100分。那是很多!我要将此用户转换为 VIP 用户。 --> UserTurnedIntoVIPEvent
  • Agg4:新的 VIP 用户?让我们将其通知给其他用户以引起嫉妒;)

基础设施:修复它并应用事件。 ;) 一旦您的持久性引擎、网络和/或机器再次启动,甚至可以在需要时“手动”。

短时间自动重试失败。错误队列/日志不会在长时间中断时丢失您的事件(并在以后应用)。

事件溯源也有助于此,因为您始终可以在“目标”聚合中重新应用持久化事件,而无需额外努力将事件保存在某个地方(即事件日志),因为您的域持久化也是您的事件存储。

关于events - DDD 使用 NoSQL 处理限界上下文中多个聚合的最终一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com