基于CQRS:多限界上下文下一次性录入产品数据时如何创建新记录?
跨多限界上下文的产品创建(CQRS实现方案)
当客户端一次性提交横跨多个限界上下文(BC)的产品数据时,用CQRS实现创建逻辑的核心是按职责拆分命令、基于事件驱动保证一致性、独立维护各BC的读写模型,具体步骤如下:
1. 统一接收请求并拆分上下文数据
客户端发送包含全量数据的CreateProduct请求(比如涵盖基础信息、库存、定价),先由API网关或前端控制器接收。随后根据各BC的职责边界,将请求数据拆分为对应BC的子命令:
- 给产品目录BC:
CreateCatalogProduct(包含名称、分类、规格等核心属性) - 给库存BC:
InitializeProductStock(包含初始库存数量、仓库位置) - 给定价BC:
SetProductPrice(包含售价、折扣规则、币种)
拆分时严格遵循每个BC的限界,禁止将不属于该BC的数据传入(比如不要把定价信息传给产品目录BC)。
2. 通过命令总线分发子命令
将拆分后的子命令通过命令总线(Command Bus)发送到对应BC的命令处理程序,常见分发策略有两种:
- 同步优先:先同步处理核心BC(比如产品目录)的命令,确保产品基础记录创建成功后,再异步分发其他BC的命令,给客户端即时反馈。
- 全异步:所有子命令异步分发,客户端通过后续查询或事件通知获取创建结果,适合对实时性要求不高的场景。
所有命令需携带全局唯一的CorrelationId,用于跟踪整个创建流程的状态。
3. 各BC独立处理命令并发布领域事件
每个BC的命令处理程序接收子命令后,完成自身聚合根的创建,并发布领域事件:
- 产品目录BC处理
CreateCatalogProduct,创建Product聚合根,发布CatalogProductCreated事件 - 库存BC处理
InitializeProductStock,创建StockItem聚合根,发布ProductStockInitialized事件 - 定价BC处理
SetProductPrice,创建Price聚合根,发布ProductPriceSet事件
每个BC仅维护自身的写模型,无需关心其他BC的处理逻辑。
4. 用Saga协调跨BC一致性(可选)
如果要求产品必须在所有BC创建成功才算“创建完成”,需引入Saga(进程管理器)协调:
- Saga监听所有BC发布的创建事件
- 当所有事件都收到时,发布
ProductCreationCompleted事件,通知客户端或更新读模型 - 如果某个BC处理失败(比如库存初始化报错),Saga触发补偿命令(比如删除产品目录中的Product记录),保证数据最终一致
5. 更新跨上下文的读模型
查询端(Read Side)订阅所有BC的领域事件,将分散的数据整合到统一的读模型中(比如ProductDetails视图,包含名称、库存、价格等全量信息)。客户端后续查询时,直接从读模型获取完整数据,无需跨BC查询。
实践注意事项
- 前置校验:在API层先对全量请求数据做格式、合法性校验,避免无效数据进入BC
- 错误处理:给每个命令设置超时、重试机制,失败时通过
CorrelationId追踪问题 - 日志监控:记录每个命令和事件的处理状态,方便排查跨BC流程的异常
内容的提问来源于stack exchange,提问作者manfrom
相关产品推荐
相关产品推荐

