事件驱动架构与 CQRS:构建灵活可靠的微服务系统
1. 事件驱动架构引入
在构建微服务系统时,仅通过 Web API 与其他系统交互存在局限性。例如,我们不清楚如何接收“批次数量变更”事件,也不知如何向外通知重新分配情况。若要了解发货延迟、数量修改等信息,以及告知仓库系统订单已分配并需发货,该如何操作呢?
事件驱动架构为解决这些问题提供了思路。系统的核心可视为消息处理器,它能通过外部消息总线(如 Redis 发布/订阅队列)接收外部事件,也能以事件形式将输出发布回外部。具体代码可从以下仓库获取:
git clone https://github.com/cosmicpython/code.git
cd code
git checkout chapter_11_external_events
# 若要跟着编码,可切换到上一个分支
git checkout chapter_10_commands
2. 分布式泥球架构问题剖析
2.1 基于名词拆分系统的弊端
许多工程师在构建微服务架构时,习惯将系统按名词拆分。例如,系统中有库存批次、订单、产品和客户等名词,就为每个“事物”创建一个关联服务,通过 HTTP API 进行交互。
以用户购物流程为例:用户访问网站选择商品,添加到购物篮时预留库存,订单完成后确认预留并通知仓库发货。若这是客户的第三次订单,还需将其标记为 VIP。此流程中的每个步骤都可视为系统命令,如 ReserveStock
、 ConfirmReservatio