📦 开源仓库:learn_cqrs_segregation · 纯 Python 标准库 · 学习演示项目
「读多写少」和「写多读少」的系统根本不该用同一个模型伺候。CQRS(Command Query Responsibility Segregation)把读写彻底分开:命令(Command)改状态、绝不返回数据;查询(Query)读状态、绝不改状态。写库之后把变更投影(projection)到一个为查询优化过的读视图上。
核心思路
命令侧(写) 查询侧(读)
┌──────────────────┐ ┌──────────────────┐
│ OrderCommandSvc │──投影──► │ OrderQuerySvc │
│ create_order() │ │ order_detail() │
│ pay_order() │ │ orders_of_user()│
└────────┬─────────┘ └────────┬─────────┘
▼ ▼
写库(规范化) 读库(扁平化、为查询优化)
- 读库是写库的投影,可随时重建/刷新
- 读写可以独立扩容,甚至用不同的数据库
为什么值得学
- 读多写少场景:读侧随便优化,不用把写逻辑搅复杂
- 独立伸缩:读副本和写节点分开扩
- 边界清晰:写逻辑和读形状不再互相打架
演示场景
- 写命令创建订单 → 写库更新,读投影同步构建
- 查询只从读库列出用户订单和订单详情
- 支付命令改状态 → 读投影立即反映 PAID
运行
python run_all.py
纯 Python 标准库,零第三方依赖,一键跑完所有演示场景后自动退出。
仓库:github.com/yxpil/learn_cqrs_segregation,欢迎 Star 与提 Issue。