在Azure上实现域事件(DDD-CQRS)

Nei*_*eil 13 azureservicebus azure-eventgrid

Microsoft docs 为DDD和CSRS 提供了一篇关于"域事件:设计和实现" 的文章.

如何在Azure上实现域事件.特别是哪些Azure服务适合,以及如何组合它们.

到目前为止,关于这个主题的文章相对较少.这个介绍似乎很好.在某种程度上,它谈到可能的实施; 例如Azure Functions与Azure Logic Apps; 和Azure Service Bus与Azure事件网格.

Bra*_*rby 5

我怀疑您是在谈论集成事件,而不是域事件。在与之链接的文章的第二段中,描述了差异,基本上是,域事件是在域内创建和使用的(通常,但不一定是在同一地址空间中),而集成事件将不同的域绑定在一起。可以使用进程内中介服务(例如Mediatr)来管理域事件。集成事件将发送到某些外部服务以进行传递。

您还应该确保您正在处理事件而不是消息。消息通常是短暂的,携带完整的数据有效负载,并请求执行某些操作。事件是短暂的或长期存在的,携带最少的负载,并通知相关方已经执行了操作。

您需要做出的另一个决定是,如果您想要事件流或仅分配事件。流将使事件持续较长的时间段(几天,几周,几个月),而分发会将事件推送到所有订户后丢弃。

这是一篇有关三个可用Azure选项的好文章 -事件网格,事件中心和服务总线。服务总线用于消息传递,事件中心用于事件流,事件网格用于事件分发。


cho*_*o70 5

事件始终是领域事件,因为它们是由领域(通常由聚合)触发的。它们是根据通用语言命名的领域对象。它是一个领域事件,无论它是被同一个BC消耗还是被另一个BC消耗,或者被它们两个消耗,都没有关系。

给定一个域事件,如果您想将其传播到您的 BC 之外,以便其他 BC 可以对其做出反应,那么您可以使用中间件消息传递系统机制(Azure 服务总线、RabbitMQ 或其他)。关键是,如果您希望 BC 对它触发的域事件做出反应,则不必使用中间件,您可以使用内部机制。但即使在这种情况下,您也应该将其发布,因为您的 BC 可能不是唯一对领域事件感兴趣的人。

微软文档中所说的集成事件并不是领域事件之外的另一种事件,它只是中间件总线/队列使用的消息的数据结构,以便当您发布领域事件时,将其转换为消息。集成事件是一种领域事件 DTO。另一方面,消费者 BC 接收集成事件并将其转换为要在消费者 BC 模型中完成的操作。

Vaughn Vernon 在红书中解释了一种管理领域事件的好方法。总结如下:

  • BC 内部的静态事件调度程序触发 BC 上发生的所有域事件。
  • 如果您希望同一个 BC 对任何域事件做出反应,您可以使用静态调度程序为其订阅一个处理程序。
  • 您还订阅了一个处理程序,该处理程序将在事件存储(BC 数据库中的一个表)中存储所有域事件。
  • 您还必须实现一个事件转发器,该转发器从事件存储中获取域事件并将它们发布到中间件消息传递系统中。

这里的链接似乎非常适合实施我刚刚告诉您使用 Azure 服务总线的策略:

http://www.reflectivesoftware.com/2015/09/01/eventual-consistency-via-domain-events-and-azure-service-bus/

希望能帮助到你。