外观主题
阅读语言

事件扇出 —— 一条事件广播给 N 条互不拖累的流水线

软件 本站软件 3小时前
https://yxp.hk/p/m8kWuO

📦 开源仓库:learn_event_fanout · 纯 Python 标准库 · 学习演示项目

订单创建后要做通知、要更新搜索索引、要加积分、还要扣库存——如果订单服务挨个串行调用,任何一家慢都会拖死下单。事件扇出(fan-out)星型架构:订单服务只管把 OrderCreated 发布一次到事件总线,所有订阅方各自独立消费,谁挂了也不影响别人。

核心思路

                    ┌─► 通知流水线      (邮件 + 推送)
                    │
 OrderCreated ──────┼─► 搜索索引流水线  (构建 + 刷新)
  (事件总线)       │
                    ├─► 积分流水线      (加分 + 升级)
                    │
                    └─► 库存流水线      (扣减 + 告警)
  • 一个事件只发布一次,所有订阅流水线独立运行
  • 某条流水线挂掉或停止,不会拖垮其他流水线
  • 新增订阅方(如审计日志)完全不用动现有流水线

为什么值得学

  • 生产者消费者解耦:订单服务根本不需要知道谁关心这条事件
  • 独立演进:通知流水线随便改,库存流水线无感知
  • 故障隔离:库存因坏数据停了,邮件/搜索/积分照常完成
  • 即插即长:加审计/BI/推荐,就是多订阅一条流水线的事

演示场景

  1. 一个事件、4 条流水线:OrderCreated 扇出给通知、搜索、积分、库存
  2. 一条停、其余继续:库存因数量为零停止,其他三条全部完成
  3. 插入新订阅方:加审计日志后变 5 条扇出,老流水线零改动

运行

python run_all.py

纯 Python 标准库,零第三方依赖,一键跑完所有演示场景后自动退出。
仓库:github.com/yxpil/learn_event_fanout,欢迎 Star 与提 Issue。