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

时间:2018-08-12 05:34:11

标签: azure event-handling domain-driven-design cqrs

Microsoft文档为DDD和CSRS提供了有关“域事件:设计和实现”的article

如何在Azure上实现域事件。特别是哪种Azure服务合适,以及如何将它们组合在一起。

到目前为止,有关该主题的文章很少。这个presentation看起来不错。它在某种程度上讨论了可能的实现;例如Azure Functions vs Azure Logic应用;和Azure Service Bus与Azure事件网格。

3 个答案:

答案 0 :(得分:3)

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

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

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

这里是a good article上的三个可用Azure选项–事件网格,事件中心和服务总线。服务总线用于消息传递,事件中心用于事件流,事件网格用于事件分发。

答案 1 :(得分:2)

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

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

Microsoft文档所说的集成事件不是域事件以外的另一种事件,它只是中间件总线/队列使用的消息的数据结构,因此,当您发布域事件时,可以将其转换为一个消息。集成事件类似于域事件DTO。另一方面,消费者BC采取整合事件并将其转换为要在消费者BC模型中完成的动作。

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

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

在这里,使用我刚刚告诉您使用Azure Service Bus实施此策略的链接似乎非常好:

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

希望有帮助。

答案 2 :(得分:0)

我们已决定将我们的系统基于Azure Service Bus,并同时使用其他消息传递服务(服务网格,事件中心),但仅用于较窄的任务。

p.s。我们的背景是ERP系统;重点放在高价值的业务消息上(而不是速度和吞吐量,其他情况可能如此)。

此Mircosofts的article(由Azure Service Bus的架构师提供)中的参数极大地影响了我们的选择。特别是以下内容:

  

Azure服务总线

     

Azure服务巴士是其他所有服务的“瑞士军刀”服务   通用消息传递任务。而Azure事件网格和Azure事件中心   对事件的收集和分发极为敏锐   大规模,高速度地使用Azure服务总线   名称空间是托管关键业务作业的队列的主机   值。它允许为需要处理的消息创建路由   在应用程序和应用程序模块之间移动。这是一个坚实的   用于工作流和事务处理的平台,并且功能强大   处理许多应用程序故障情况的工具。

     

在销售点解决方案中记录的销售都是财务记录   和库存跟踪记录,而不仅仅是一个事件。记录下来   在分类帐中,最终将合并到一个集中式分类帐中   会计系统,通常是通过多个集成桥,以及   信息一定不能在途中丢失。销售信息,   可能表示为单独的消息以跟踪库存   可以使用销售点和整个销售区域的级别   启动自动补给订单,订单状态倒退   到销售点。

     

服务总线的特殊优势还在于它的桥梁作用   混合云解决方案和系统的要素之间,包括   分支机构或工作场所系统。位于“背后”的系统   防火墙”,正在网络上漫游或偶尔离线   无法通过“推送”消息直接到达,但需要消息   被发送到指定地点的约定取件地点   接收者可以获取它们。

     

服务总线队列或主题订阅非常适合此用例,   业务应用程序的核心位于云甚至是云中   现场数据中心,分支机构,工作地点或服务租户   遍布世界各地。该模型在SaaS中特别受欢迎   卫生保健,税收和法律咨询,餐馆的提供者   服务和零售。

     

组成

     

因为通常很难在各个   用例中,这三个服务也可以组成。

     

例如服务总线和事件中心都会将事件发送到事件网格中,从而使应用程序能够快速响应更改,而不会在空闲时间上浪费资源

     

https://azure.microsoft.com/sv-se/blog/events-data-points-and-messages-choosing-the-right-azure-messaging-service-for-your-data/

https://azure.microsoft.com/sv-se/blog/events-data-points-and-messages-choosing-the-right-azure-messaging-service-for-your-data/

另一篇好文章(由@ brad-irby指出)提供了更多详细信息和一些不同的观点: https://docs.microsoft.com/en-us/azure/event-grid/compare-messaging-services

我们还添加了event sourcing功能;这对我们来说非常重要。