Rabbitmq 了解Vaughn Vernon的最终一致性、后台登录项和任务示例

Rabbitmq 了解Vaughn Vernon的最终一致性、后台登录项和任务示例,rabbitmq,domain-driven-design,domain-events,Rabbitmq,Domain Driven Design,Domain Events,我正在努力理解如何实现与Vaughn Vernon公开的backlogitem和任务示例的最终一致性。到目前为止,我理解的陈述是(考虑到他将BacklogItem和Task拆分为单独的聚合根的情况): BacklogItem可以包含一个或多个任务。当BacklogItem的任务的所有剩余小时数为0时,BacklogItem的状态应更改为“完成” 我知道一条规则,即您不应该在同一事务中更新两个聚合根,并且您应该以最终的一致性来实现这一点 域服务更新任务的小时数后,应将taskremainingho

我正在努力理解如何实现与Vaughn Vernon公开的backlogitem和任务示例的最终一致性。到目前为止,我理解的陈述是(考虑到他将BacklogItem和Task拆分为单独的聚合根的情况):

BacklogItem可以包含一个或多个任务。当BacklogItem的任务的所有剩余小时数为0时,BacklogItem的状态应更改为“完成”

我知道一条规则,即您不应该在同一事务中更新两个聚合根,并且您应该以最终的一致性来实现这一点

域服务更新任务的小时数后,应将
taskremaininghoursrupdated
事件发布到与执行代码位于同一线程中的
DomainEventPublisher
。在这里,我对以下问题感到困惑:

  • 我认为应该有一个订阅者(我猜也是住在同一个线程中)对
    taskremaininghoursrupdated
    事件做出反应。在桌面/Web应用程序中的哪个点执行对总线的订阅?在你的应用程序初始化的时候?在应用程序代码中?是否有理由将域订阅器放置在特定位置
  • 该订阅程序(在同一线程中)是否应该调用BacklogItem存储库并执行更新?(但这违反了不在同一事务中更新两个聚合的规则,因为这将同步发生,对吗?)
  • 如果您希望实现最终的一致性以满足前面提到的规则,那么即使BacklogItem和Task都位于同一个有界上下文中,我真的需要像RabbitMQ这样的消息代理吗
  • 如果我使用这个消息代理,我是否应该有一个后台线程或某个只使用RabbitMQ队列中的事件,然后分派事件来更新产品

如果有人能清楚地说明这一点,我将不胜感激,因为它的完整性非常复杂。

因此,首先,您需要认识到,如果
BacklogItem
是是否“完成”的权威,那么它需要拥有所有信息来自行计算

因此,BacklogItem中的某个位置是跟踪它知道哪些任务以及这些任务的已知状态的数据。换句话说,
BacklogItem
有一个关于任务信息的旧副本

这就是“最终一致性”部分;我们正在尝试安排系统,以便
BacklogItem
边界中的缓存数据副本包含对任务状态的新更改

这反过来意味着我们需要向
BacklogItem
发送一个命令,通知它任务的更改

从backlog项的角度来看,我们并不真正关心命令来自哪里。例如,我们可以将其设置为手动流程“在完成任务后,单击此处的此按钮以通知待办事项”

但是为了用户的理智,我们更可能安排一个事件处理程序运行:当您看到任务的输出时,将其转发到相应的backlog项

在桌面/Web应用程序中的哪个点执行对总线的订阅?在你的应用程序初始化的时候

这似乎很合理

该订阅程序(在同一线程中)是否应该调用BacklogItem存储库并执行更新?(但这违反了不在同一事务中更新两个聚合的规则,因为这将同步发生,对吗?)

同一线程和同一事务不一定是一致的。它可以在同一个线程中进行协调;但让后果发生在幕后可能更有意义。在其核心,事件和命令只是消息——编写消息,将其放入收件箱,让下一个线程担心处理

如果您希望实现最终的一致性以满足前面提到的规则,那么即使BacklogItem和Task都位于同一个有界上下文中,我真的需要像RabbitMQ这样的消息代理吗


没有;管道的机制根本不重要。

因此,首先,您需要认识到,如果
BacklogItem
是是否“完成”的权威,那么它需要拥有所有信息来自行计算

因此,BacklogItem中的某个位置是跟踪它知道哪些任务以及这些任务的已知状态的数据。换句话说,
BacklogItem
有一个关于任务信息的旧副本

这就是“最终一致性”部分;我们正在尝试安排系统,以便
BacklogItem
边界中的缓存数据副本包含对任务状态的新更改

这反过来意味着我们需要向
BacklogItem
发送一个命令,通知它任务的更改

从backlog项的角度来看,我们并不真正关心命令来自哪里。例如,我们可以将其设置为手动流程“在完成任务后,单击此处的此按钮以通知待办事项”

但是为了用户的理智,我们更可能安排一个事件处理程序运行:当您看到任务的输出时,将其转发到相应的backlog项

在桌面/Web应用程序中的哪个点执行对总线的订阅?在你的应用程序初始化的时候

这似乎很合理

该订阅程序(在同一线程中)是否应该调用BacklogItem存储库并执行更新?(但这违反了在同一事务中不更新两个聚合的规则,因为这会