3. 识别业务模块:从业务需求出发、事件风暴工作坊、初步划分限界上下文

业务模块的识别是领域驱动设计的核心起点,它决定了后续代码模型、服务拆分和团队协作的边界。本章将围绕“从业务需求出发 → 事件风暴工作坊 → 初步划分限界上下文”这一主线,系统讲解如何将模糊的业务诉求转化为清晰的模块边界。

3.1 从业务需求出发:识别核心域与支撑域

在启动任何技术设计之前,必须首先理解业务的全景图。业务需求通常以用户故事、功能列表或产品愿景的形式呈现。我们需要从中提炼出三个关键层次:

层次 定义 示例(电商系统)
核心域 系统最核心、最具竞争力的业务逻辑,是系统存在的根本原因。 订单处理、支付结算、库存扣减
支撑域 为核心域提供必要支持,但本身不构成核心竞争力。 用户管理、商品信息管理、物流对接
通用域 行业通用、可复用的能力,通常可引入现成解决方案。 短信通知、邮件发送、权限认证
实践建议:在项目初期,优先投入资源到核心域的建模与实现。支撑域和通用域可以适当简化或引入第三方服务,避免过早陷入非核心细节。

3.2 事件风暴工作坊:从事件中挖掘聚合与边界

事件风暴(Event Storming)是一种协作建模技术,通过“领域事件”作为主线,将业务专家、产品经理和开发团队聚集在一起,快速发现业务全貌。以下是标准工作坊的五个步骤:

  1. 定义领域事件:用橙色便签记录业务中发生的“已经完成”的事实,例如“订单已创建”、“支付已成功”。
  2. 识别命令:用蓝色便签记录触发事件的动作,例如“提交订单”、“确认支付”。
  3. 引入聚合:将相关的事件和命令分组,形成高内聚的聚合(Aggregate),例如“订单聚合”包含“创建订单”、“取消订单”、“订单已发货”等。
  4. 标记限界上下文:根据聚合之间的耦合度和业务语义,将聚合归入不同的限界上下文(Bounded Context)。
  5. 绘制上下文映射:用箭头和关系线描述上下文之间的协作方式(如合作关系、客户/供应商关系)。
关键产出物:事件风暴工作坊结束后,团队应得到一张包含领域事件、命令、聚合和限界上下文的完整全景图。这张图是后续代码模型和微服务拆分的基础。
事件风暴工作坊流程 1. 定义领域事件 橙色便签 2. 识别命令 蓝色便签 3. 引入聚合 高内聚分组 4. 标记上下文 限界上下文 5. 映射 上下文 产出物:领域事件 + 命令 + 聚合 + 限界上下文全景图 团队协作建模,业务专家与开发人员共同参与

3.3 初步划分限界上下文:从聚合到模块边界

限界上下文(Bounded Context)是 DDD 中最重要的战术模式之一。它定义了模型的应用边界,每个上下文内部拥有独立的领域模型、数据库和团队。划分限界上下文时,应遵循以下原则:

  • 业务语义完整性:一个上下文内的聚合应围绕同一个业务概念(如“订单”、“支付”、“库存”)。
  • 高内聚低耦合:上下文内部聚合之间频繁交互,上下文之间通过事件或 API 进行松耦合通信。
  • 团队自治:每个上下文最好由一个团队独立负责,减少跨团队协调成本。
  • 数据所有权:每个上下文拥有自己的数据存储,避免跨上下文直接访问数据库。
常见误区:不要将限界上下文等同于微服务。一个限界上下文可以拆分为多个微服务,但一个微服务不应跨越多个限界上下文。初期建议一个上下文对应一个服务,后续根据性能或团队规模再拆分。
电商系统限界上下文划分示例 订单上下文 订单聚合 订单项聚合 发货单聚合 数据库:order_db 支付上下文 支付聚合 退款聚合 交易记录聚合 数据库:payment_db 库存上下文 库存聚合 入库单聚合 出库单聚合 数据库:inventory_db 支付成功事件 扣减库存命令 每个限界上下文拥有独立的领域模型、数据库和团队 上下文之间通过领域事件或 API 进行松耦合通信

3.4 实战案例:从事件风暴到限界上下文

假设我们正在设计一个在线教育平台。通过事件风暴工作坊,我们识别出以下关键领域事件:

领域事件 所属聚合 建议限界上下文
课程已创建 课程聚合 课程上下文
章节已发布 章节聚合 课程上下文
用户已报名 报名聚合 学习上下文
学习进度已更新 进度聚合 学习上下文
订单已支付 支付聚合 支付上下文
优惠券已发放 营销聚合 营销上下文
划分结果:在线教育平台初步划分为四个限界上下文:课程上下文(课程管理、章节管理)、学习上下文(报名、进度、测评)、支付上下文(订单、支付、退款)、营销上下文(优惠券、活动、推荐)。每个上下文独立演进,通过事件驱动协作。

3.5 本章小结

识别业务模块是 DDD 落地的第一步,也是最重要的一步。通过“业务需求分析 → 事件风暴工作坊 → 限界上下文划分”这一流程,团队能够快速建立对业务全景的共识,并形成清晰的模块边界。在 Go 语言项目中,这些边界将直接映射为 module 目录结构、package 划分和 interface 定义,为后续的代码实现奠定坚实基础。