Microsoft docs 为 DDD 和 CSRS 提供了一篇关于“域事件:设计和实现”的文章。
如何在 Azure 上实现域事件。特别是哪些 Azure 服务适合,以及如何组合它们。
到目前为止,关于这个主题的文章相对较少。这个演示似乎不错。它部分讨论了可能的实现;例如 Azure Functions 与 Azure Logic Apps;和 Azure 服务总线与 Azure 事件网格。
我怀疑您在谈论集成事件,而不是域事件。在您链接到它的文章的第二段中描述了差异,这基本上是域事件是在域内创建和使用的(通常但不一定在同一地址空间中),而集成事件将不同的域联系在一起。可以使用诸如 Mediatr 之类的进程内中介服务来管理域事件。集成事件将被发送到某些外部服务以进行交付。
您还应该确保您使用的是事件而不是消息。消息通常是短暂的,携带完整的数据有效负载,并请求执行某些操作。事件是短期或长期的,携带最小的有效负载,并通知相关方已经执行了一个动作。
您需要做出的另一个决定是您想要一个事件流还是简单的分发。流将事件保留很长一段时间(几天、几周、几个月),而分发将在向所有订阅者推送后丢弃事件。
这是一篇关于三个可用 Azure 选项的好文章——事件网格、事件中心和服务总线。Service Bus 用于消息传递,Event Hub 用于事件流,Event Grid 用于事件分发。
事件始终是域事件,因为它们由域(通常由聚合)触发。它们是根据通用语言命名的领域对象。它是一个领域事件,不管它是被同一个 BC 或另一个 BC 消费,还是被他们两个消费,都没有关系。
给定一个域事件,如果您想将它从您的 BC 中传播出去,以便其他 BC 可以对其做出反应,那么您可以使用中间件消息系统机制(Azure 服务总线、RabbitMQ 或其他)。关键是,如果您希望您的 BC 对它触发的域事件做出反应,您不必使用中间件,您可以使用内部机制。但即使在这种情况下,您也应该将其发布,因为您的 BC 可能不是唯一对域事件感兴趣的人。
微软文档中所说的集成事件并不是域事件之外的另一种事件,它只是中间件总线/队列使用的消息的数据结构,所以当你发布一个域事件时,你就将它翻译成消息。集成事件是一种领域事件 DTO。另一方面,消费者 BC 接受集成事件并将其转换为要在消费者 BC 模型中完成的操作。
Vaughn Vernon 在红皮书中解释了一种管理领域事件的好方法。总结如下:
这是一个链接,似乎很好地实现了我刚刚告诉你使用 Azure 服务总线的这个策略:
希望能帮助到你。
我们决定将我们的系统基于Azure 服务总线,并使用其他消息服务(服务网格、事件中心),但用于更窄的任务。
ps我们的上下文是ERP系统;其中重点是高价值的业务消息(而不是速度,吞吐量可能是其他人的情况)。
这篇 Mircosofts文章(Azure Service Bus 的架构师)中的论点对我们的选择产生了很大的影响。特别是以下内容:
Azure 服务总线
Azure 服务总线是适用于所有其他通用消息传递任务的“瑞士军刀”服务。虽然 Azure 事件网格和 Azure 事件中心非常关注以极快的速度大规模收集和分发事件,但 Azure 服务总线命名空间是用于存放具有关键业务价值的作业的队列的主机。它允许为需要在应用程序和应用程序模块之间传输的消息创建路由。它是一个用于工作流和事务处理的可靠平台,并具有处理许多应用程序故障条件的强大设施。
销售点解决方案中记录的销售既是财务记录又是库存跟踪记录,而不仅仅是一个事件。它被记录在一个分类账中,最终将被合并到一个集中的会计系统中,通常通过几个集成桥梁,并且信息不能在途中丢失。销售信息,可能表示为单独的消息,以跟踪销售点和整个销售区域的库存水平,可用于启动自动补给订单,订单状态流回销售点。
服务总线的一个特殊优势还在于它充当了混合云解决方案元素与包括分支机构或工作场所系统在内的系统之间的桥梁。位于“防火墙后”、在网络中漫游或偶尔离线的系统无法通过“推送”消息直接访问,但需要将消息发送到指定接收者可以从中获取它们的约定取件位置。
服务总线队列或主题订阅非常适合此用例,其中业务应用程序的核心位于云中,甚至位于遍布全球的现场数据中心、分支机构、工作地点或服务租户中。这种模式在医疗保健、税务和法律咨询、餐饮服务和零售领域的 SaaS 提供商中特别受欢迎。
作品
因为通常很难在各种用例之间划清界限,所以也可以组合这三个服务。
例如,服务总线和事件中心都会将事件发送到事件网格中,这将允许应用程序快速响应更改,同时不会在空闲时间浪费资源
另一篇好文章(@brad-irby 指出)提供了更多细节和不同的观点: https ://docs.microsoft.com/en-us/azure/event-grid/compare-messaging-services
我们还增加了event sourcing
功能;这在我们的上下文中非常重要。