结合领域事件和微服务的实现领域驱动设计 - Alagarsamy


INDU Alagarsamy最近在  QCon大会纽约2019大会谈到如何使用定义良好的限界上下文和事件相结合开发微服务,从而能灵活地适应业务的变化。
当你开始在干净和明确定义的有界上下文之间使用消息传递技术进行通信时,你可以删除时间耦合。有界上下文提供了清晰度,每个有界上下文中的模型在逻辑上是一致的,并且可以自由发展。
例如电子商务应用程序的用例,其中“产品”是核心实体之一。产品实体是基于上下文的,对不同的域团队意味着不同的事情,如下所示:

  • 销售:这是一个有描述,图像和价格的东西
  • 库存:这是一个可用或不可用的东西
  • 运输:这是一件需要包装的重量和尺寸的东西

创建统一模型很难,在业务领域之间找到正确的界限可能是一个挑战。她建议可以根据团队和部门拆分领域模型,以帮助更好地组织模型。它也可以根据系统中的业务流程进行拆分。

Alagarsamy讨论了有界上下文之间如何通过命令和事件相互通信。事件作为不同有界上下文之间的通信机制是有用的。它们有助于最小化有界上下文之间的时间耦合。命令可在一个有界上下文内用作通信方式。一旦为事件和命令建模,编写代码就会变得简单得多。在需求收集阶段,在业务需求描述中查找关键词“when”; 这通常表示业务活动或事件。

使用航空公司应用程序的例子,当飞机类型改变时:

  • 通过新的预订建议通知乘客
  • 乘客可以取消航班
  • 乘客可以接受建议的预订

事件和消息如何与应用程序中的业务流程相关联?业务流程可以由来自不同有界上下文的事件触发。多条消息可以参与业务流程。在设计消息时,使它们不可变,即摆脱公共 setter函数。而是在领域类的构造函数中设置属性。

Saga模式可用于管理在同一事务中的多个消息。该模式允许您在业务流程中的任何步骤不成功的情况下采取补偿措施。
事件风暴是整体需求分析工作中的另一个关键步骤。它是开发团队与业务利益相关者用于探索复杂业务领域的协作技术。使用事件风暴技术进行领域建模有助于识别事件发生的时间以及应用程序应采取的操作。这些即是命令与事件。
对域模型中的各种元素使用适当的命名约定也很重要。为代码处理程序提供正确的名称,并在代码审查和同行评审期间验证名称。检查事件,类和处理程序的语言和命名。
模型并不完美,团队应该遵循下面这些实践,以确保他们的领域模型与业务目标和要求保持一致。

  • 与领域专家交流。与他们的事件风暴。
  • 通过对领域语言的痴迷来进化和重构。
  • 争取自治。使用事件在有界上下文之间进行通信。