Saga模式:解决分布式服务交互难题
1. 问题引入
在处理服务请求时,事务性服务模式可使服务可靠地处理请求,但它只能解决部分问题。以电商场景中的订单服务为例,前端将订单发送给订单服务,订单服务需向供应商服务订购零件,并要求计费服务向客户计费。所有处理“下单”消息的操作都在一个本地事务中完成。
然而,这里存在两个主要问题:
- 若订单服务决定中止内部事务,会发生什么?
- 订单服务如何从其他服务获得承诺,以便继续工作?
一个明显的解决方案是将订单服务的内部事务扩展到其他服务,即分布式事务。使用分布式事务,订单服务需在一个事务中调用计费服务和供应商系统,若所有服务同意提交,整个事务才会提交完成。但这种方式存在诸多问题:
- 若供应商需高级经理授权才能完成交易,你不能一直持有内部锁等待。
- 若供应商是竞争对手,可能会延长事务以扰乱业务。
- 无法对其他服务的操作方式做出假设,尤其是非自有服务。
- 长事务并非良策,服务间交互越复杂,就越需考虑原子事务的替代方案。大量消息在服务间来回流动会增加延迟和失败的可能性,而少量稀疏的交互又不现实。
因此,问题归结为:如何在无事务的情况下实现服务间的分布式共识?
2. 解决方案:Saga模式
Saga交互模式旨在提供语义和组件,支持服务间的长期对话。实现Saga模式,需将服务交互(业务流程)分解为多个较小的业务操作和反向操作,并基于消息和超时来协调和管理对话。
2.1 Saga的定义
Saga被定义为一系列相关的小事务。在Saga中,协调器确保所有相关事务成功完成,若事务失败,协
超级会员免费看
订阅专栏 解锁全文
670

被折叠的 条评论
为什么被折叠?



