CQRS、SAGA与Event Sourcing:4大微服务核心模式通俗讲解(Java-Backend)
【免费下载链接】Java-BackendThese are resources, roadmaps, links to learn Java Backend :)项目地址: https://gitcode.com/gh_mirrors/jav/Java-Backend
📖 Java-Backend 是一个面向初学者的 Java 后端学习资源仓库,提供完整的学习路线图与精选资源。本文基于它 README.md 中的 Microservices Patterns 章节,用最通俗的比喻讲透 CQRS、SAGA、Event Sourcing 和 Aggregator 这 4 大微服务核心模式,帮助新手快速理解并应对架构与面试场景。
为什么微服务离不开这 4 大模式?
把单体应用拆成微服务后,一个"下单"操作可能涉及订单、库存、支付、积分等多个服务。随之而来的是三个经典难题:
| 难题 | 一句话描述 | 对应模式 |
|---|---|---|
| 跨服务数据要拼装 | 接口要聚合多个服务的数据 | Aggregator |
| 读多写少,性能瓶颈 | 读写互相拖累 | CQRS |
| 跨服务事务难保证 | 一个服务失败,其他已执行的服务怎么办 | SAGA |
| 出问题查不到"当时发生了什么" | 只存最终状态,历史全丢 | Event Sourcing |
这 4 个模式正是 README.md 中 "Microservices Patterns" 一节列出的必学清单。
1️⃣ Aggregator:给 API 加一个"前台接待"
场景:App 首页要显示用户信息、订单数、优惠券,如果前端分别调 3 个服务,请求多、体验差。
做法:加一个聚合器服务当"前台接待"——前端只问它一次,它去后台各服务取数据,拼装成一个完整结果再返回。
- ✅ 适合:接口需要组合多个微服务数据(BFF 模式)
- ⚠️ 注意:聚合器只做"组装",别把业务逻辑都堆进来
2️⃣ CQRS:读写分离,各干各的
CQRS(Command Query Responsibility Segregation,命令查询职责分离)的思想:写数据用"命令",读数据用"查询",两边用不同的模型,甚至不同的库。
打个比方:银行把"存款窗口"和"取款窗口"分开。存款窗口专注记账、审核(写模型,结构严谨);取款窗口只负责快速查余额(读模型,索引优化、可以加缓存)。两边还各扩各的容——读请求多就多加"取款窗口",互不拖累。
- ✅ 适合:读远多于写、读写性能要求差异大的系统
- ⚠️ 注意:两套数据要靠消息保持最终一致,简单 CRUD 系统不必上
3️⃣ SAGA:跨服务"长事务"的解药
传统数据库事务"要么全成、要么全滚",但事务没法跨多个独立数据库。SAGA 的思路是:把大事务拆成一串小步骤,每步是一个本地事务,失败就执行"补偿操作"回退前面的步骤。
🧳 用旅行代理来理解:订机票 → 订酒店 → 买保险。如果保险买失败了,就退酒店、退机票(补偿),而不是让整单"回滚"。
两种落地方式:
编排式:一个"总指挥"服务按顺序调度每一步,流程清晰、便于排错
协作式:每个服务做完后发事件,下一个服务听到再动手,松耦合但链路难追踪
✅ 适合:下单、转账等跨多个服务的长流程业务
⚠️ 注意:必须为每一步设计好"补偿动作",且操作要幂等
4️⃣ Event Sourcing:只记"发生了什么",不记"最后是什么样"
传统数据库存的是"当前状态"(余额:100 元),Event Sourcing 则把每一次变动都存成不可变的事件:
充值 500 元 → 消费 200 元 → 退款 300 元
- 🕰️可回放:把事件从头"重放"一遍,随时还原任意时刻的状态
- 🔍可审计:出问题能精确查到"当时到底发生了什么",金融、医疗场景尤其友好
- ⚠️ 注意:事件会越存越多,通常需要配合快照(定期存一份当前状态)
💡 一个记忆小技巧:Event Sourcing 常和 CQRS 搭档使用——事件流是"写侧",读模型从事件构建,正好接上第 2 节。
一张表看懂 4 大模式何时用
| 你的痛点 | 该上哪个模式 |
|---|---|
| 前端要调一堆接口拼数据 | Aggregator |
| 查询慢、读写互相抢资源 | CQRS |
| 跨服务操作需要"部分回退" | SAGA |
| 需要完整历史、审计与回放 | Event Sourcing |
🎯 新手建议:不必一开始全用。小系统先用 SAGA 的编排式 + Aggregator 就能解决 80% 的问题,读压力真的大了再考虑 CQRS。
在 Java-Backend 仓库中继续学习
想系统跟进微服务知识,可以按仓库路线图推进:
- 🗺️ 微服务完整路线(Spring Cloud、DevOps、消息队列):README.md
- 📡 消息队列选型(Kafka、RabbitMQ、SQS),SAGA 与事件驱动离不开它们:README.md
- 💬 系统消息系统专题(Kafka、死信队列等):README.md
- 📚 精选书籍、文档与面试题资源:README.md
- 📄 项目采用 Apache 2.0 协议:LICENSE
按这份路线从 Java 基础一步步走到微服务核心模式,CQRS、SAGA 和 Event Sourcing 就不再只是面试名词,而是你设计系统时的常用工具了 ✨
【免费下载链接】Java-BackendThese are resources, roadmaps, links to learn Java Backend :)项目地址: https://gitcode.com/gh_mirrors/jav/Java-Backend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考