📦 开源仓库:learn_event_fanout · 纯 Python 标准库 · 学习演示项目
订单创建后要做通知、要更新搜索索引、要加积分、还要扣库存——如果订单服务挨个串行调用,任何一家慢都会拖死下单。事件扇出(fan-out)星型架构:订单服务只管把 OrderCreated 发布一次到事件总线,所有订阅方各自独立消费,谁挂了也不影响别人。
核心思路
┌─► 通知流水线 (邮件 + 推送)
│
OrderCreated ──────┼─► 搜索索引流水线 (构建 + 刷新)
(事件总线) │
├─► 积分流水线 (加分 + 升级)
│
└─► 库存流水线 (扣减 + 告警)
- 一个事件只发布一次,所有订阅流水线独立运行
- 某条流水线挂掉或停止,不会拖垮其他流水线
- 新增订阅方(如审计日志)完全不用动现有流水线
为什么值得学
- 生产者消费者解耦:订单服务根本不需要知道谁关心这条事件
- 独立演进:通知流水线随便改,库存流水线无感知
- 故障隔离:库存因坏数据停了,邮件/搜索/积分照常完成
- 即插即长:加审计/BI/推荐,就是多订阅一条流水线的事
演示场景
- 一个事件、4 条流水线:
OrderCreated扇出给通知、搜索、积分、库存 - 一条停、其余继续:库存因数量为零停止,其他三条全部完成
- 插入新订阅方:加审计日志后变 5 条扇出,老流水线零改动
运行
python run_all.py
纯 Python 标准库,零第三方依赖,一键跑完所有演示场景后自动退出。
仓库:github.com/yxpil/learn_event_fanout,欢迎 Star 与提 Issue。