微服务之saga模式
- -你已经使用 database ber service 模式. 每个service拥有自己的database. 一些业务事务会跨越多个service,所以你需要来确保data consistency. 例如,假设你正在构建一个电子商务网站,这个网站的用户的会有一个最大欠款限制,应用程序必须确保一个新订单不能超过用户的最大前款限制,但是orders表和customers表不在同一个数据库,所以应用程序不能简单的使用本地的ACID事务.
你已经使用 database ber service 模式。每个service拥有自己的database。一些业务事务会跨越多个service,所以你需要来确保data consistency。例如,假设你正在构建一个电子商务网站,这个网站的用户的会有一个最大欠款限制,应用程序必须确保一个新订单不能超过用户的最大前款限制,但是orders表和customers表不在同一个数据库,所以应用程序不能简单的使用本地的ACID事务。
怎么确保跨越多个service的数据一致性
2pc(两阶段提交)不是一个好的选择
把跨越多个service的每一个单独的事务实现成saga模式。一个saga是由local transaction组成的序列。每个local transaction更新本地数据库,然后发布一个message 或者event来触发下一个事务。如果有一个本地事务失败了,saga就会执行一系列的补偿事务来回滚之前的事务所做的修改。
saga模式有如下两种协作方式。
Choreography(编排)--每个本地事务发布domain event来触发别的service的local transaction.
Orchestration --有一个orchestrator 对象来告诉参与者执行哪一个事务。
一个电子商务网站使用choreography-based saga 来创建一个order。
这是一个使用Orchestration-based saga 模式来创建一张order的例子
saga模式有如下好处
saga模式的缺点
需要解决的问题