3. 战略设计:限界上下文的识别与划分、上下文映射与核心域分析

战略设计是领域驱动设计(DDD)中最高层次的架构决策,它决定了软件系统的宏观结构。本章聚焦于如何通过限界上下文(Bounded Context)的识别与划分来定义模块边界,利用上下文映射(Context Map)管理跨边界协作,并通过核心域/支撑域/通用域的分类指导资源投入与架构优先级。

3.1 限界上下文的识别与划分

限界上下文是DDD中最重要的战术与战略边界。每个限界上下文对应一个独立的业务子问题域,拥有自己的统一语言(Ubiquitous Language)、领域模型和数据库模式。错误的边界划分会导致模型污染、团队冲突和系统耦合。

3.1.1 识别限界上下文的六大信号

信号类型 具体表现 典型示例
语言差异 同一术语在不同团队/模块中含义不同 “客户”在销售团队指潜在客户,在售后团队指已签约客户
变更频率 部分业务逻辑变更速度显著快于其他部分 促销规则每周调整,而订单基础结构每月变更一次
团队结构 不同团队负责不同业务能力 支付团队、库存团队、物流团队各自独立
数据所有权 数据由不同部门维护,更新策略不同 用户画像数据由市场部维护,财务数据由财务部维护
部署独立性 部分功能需要独立发布和扩缩容 搜索服务需要高频更新,而基础用户服务低频变更
业务生命周期 业务实体在不同阶段有不同行为 订单在“待支付”“已发货”“已完成”状态下的处理逻辑差异巨大

3.1.2 划分原则与反模式

  • 按业务能力划分:每个限界上下文封装一个完整的业务能力,如“订单管理”“库存管理”“支付处理”。
  • 按业务子域划分:与问题空间(Problem Space)的子域对齐,一个子域通常对应一个限界上下文。
  • 避免“大泥球”:不要将所有业务逻辑塞入一个限界上下文,即使初期看起来简单。
  • 避免“微服务碎片化”:不要将每个实体或每个用例都拆成一个独立的限界上下文,导致分布式复杂性失控。
实践建议:在项目启动阶段,先识别出3-5个最明显的限界上下文,然后通过事件风暴(Event Storming)或业务场景分析逐步细化。不要追求一次性完美划分,允许在迭代中调整边界。

3.2 上下文映射(Context Map)

上下文映射是战略设计的核心工具,它描述了不同限界上下文之间的协作关系。通过上下文映射,我们可以明确每个限界上下文的职责边界、依赖方向和集成策略。

3.2.1 九种协作模式

模式 关系类型 适用场景 耦合度
合作关系(Partnership) 双向依赖 两个团队需要紧密协作完成一个共同目标 高
共享内核(Shared Kernel) 共享模型 两个上下文共享一小部分核心模型 高
客户-供应商(Customer-Supplier) 单向依赖 上游(供应商)影响下游(客户) 中
遵奉者(Conformist) 单向依赖 下游完全遵循上游模型,无抗腐层 中
防腐层(Anticorruption Layer) 单向依赖 下游需要隔离上游模型的变更影响 低
开放主机服务(Open Host Service) 单向依赖 上游提供标准化API供多个下游使用 低
发布语言(Published Language) 单向依赖 使用标准协议(如REST、gRPC)进行通信 低
分离方式(Separate Ways) 无依赖 两个上下文完全独立,无任何集成 无
大泥球(Big Ball of Mud) 混乱依赖 无明确边界,模型相互渗透(应避免) 极高

3.2.2 上下文映射示例图

上下文映射示例:电商系统 电商系统上下文映射示例 订单上下文 Order Context 库存上下文 Inventory Context 支付上下文 Payment Context 用户上下文 User Context 物流上下文 Logistics Context 通知上下文 Notification Context 客户-供应商 防腐层 (ACL) 遵奉者 开放主机服务 发布语言 图例说明 • 客户-供应商:订单上下文依赖库存上下文提供库存数据 • 防腐层:订单上下文通过ACL隔离支付上下文的模型变更 • 遵奉者:用户上下文完全遵循订单上下文的用户模型 • 开放主机服务:订单上下文提供标准化API供物流上下文调用 • 发布语言:支付上下文通过标准事件通知上下文

3.3 核心域、支撑域与通用域

在战略设计中,我们需要对业务子域进行优先级分类,以决定资源投入和架构策略。这种分类帮助团队聚焦于最具竞争力的部分,同时合理处理非核心功能。

3.3.1 三类子域定义

类型 定义 业务价值 架构策略 示例
核心域(Core Domain) 企业最核心的竞争力所在,是业务差异化的来源 高 自研、投入最多资源、持续优化 电商的推荐算法、银行的信贷审批模型
支撑域(Supporting Subdomain) 支持核心业务运行,但本身不构成核心竞争力 中 自研或外包,适度投入 订单管理、用户管理
通用域(Generic Subdomain) 行业通用能力,无差异化价值 低 采购成熟产品、使用开源方案 邮件通知、身份认证、日志记录

3.3.2 分类决策矩阵

在识别子域类型时,可以从两个维度进行评估:业务差异化程度和内部复杂度。

  • 高差异化 + 高复杂度 → 核心域:必须自研,投入最优秀的团队,持续演进。
  • 高差异化 + 低复杂度 → 核心域:虽然简单,但因为是差异化来源,仍需自研。
  • 低差异化 + 高复杂度 → 支撑域:考虑外包或采购,但需要一定定制。
  • 低差异化 + 低复杂度 → 通用域:直接采购或使用开源方案。
常见误区:很多团队将大量资源投入到通用域(如用户认证、日志系统)的“自研轮子”上,而忽视了核心域的打磨。正确的做法是:核心域占研发资源的60%以上,支撑域占30%,通用域不超过10%。

3.3.3 核心域识别流程

  1. 业务愿景分析:明确企业的战略目标和核心竞争力是什么。
  2. 价值流映射:绘制端到端的业务价值流,识别哪些环节直接产生客户价值。
  3. 竞品差异分析:对比竞争对手,找出哪些能力是独有的或领先的。
  4. 利润贡献评估:分析各业务模块对收入和利润的贡献度。
  5. 专家访谈:与业务专家和产品负责人确认核心业务逻辑。

3.4 战略设计综合示例

以下是一个在线教育平台的战略设计示例,展示了限界上下文划分、上下文映射和子域分类的综合应用。

在线教育平台战略设计示例 在线教育平台战略设计示例 核心域(Core Domain) 智能推荐引擎 课程推荐、学习路径规划 自适应学习系统 个性化学习体验 内容创作平台 课程制作、版权管理 支撑域(Supporting Subdomain) 订单与支付 用户与账户 学习进度追踪 通用域(Generic Subdomain) 邮件/短信通知 身份认证 日志与监控
战略决策要点:
  • 核心域(智能推荐、自适应学习、内容创作)全部自研,投入最优秀的算法和工程团队。
  • 支撑域(订单、用户、学习进度)自研但使用成熟框架,保持适度投入。
  • 通用域(通知、认证、日志)直接采购第三方服务或使用开源方案,不投入自研资源。
  • 上下文映射采用防腐层模式隔离核心域与支撑域,确保核心域模型不受外部变更影响。

3.5 本章小结

  • 限界上下文是战略设计的基本单元,通过语言差异、变更频率、团队结构等信号识别边界。
  • 上下文映射提供了九种协作模式,帮助团队选择正确的集成策略,避免高耦合。
  • 核心域/支撑域/通用域分类指导资源分配:核心域自研深耕,支撑域适度投入,通用域采购复用。
  • 战略设计不是一次性的,需要随着业务发展和团队认知提升持续演进。