华为 姜宁 - 《Saga分布式事务解决方案与实践》
2020-02-27 266浏览
- 1.《Saga分布式事务解决⽅方案与实践》 演讲者/姜宁
- 2.关于我 • 华为开源能⼒力力中⼼心 • ServiceComb项⽬目负责⼈人 • Apache Member , IPMC, 多个Apache项⽬目 • RedHat, IONA, Travelsky
- 3.议题 • 微服务事务⼀一致性问题? • 业界Saga的解决⽅方案 • ServiceComb Saga的演进 • 后续的开发计划
- 4.微服务架构 • 微服务架构将⼀一个应⽤用分成多个相互独⽴立的服务。 • 好处是各个服务能够持续独⽴立的开发和部署。 • 难题是服务的数据需要采⽤用什什么样的⽅方式来进⾏行行存储?
- 5.多个微服务使⽤用同⼀一数据库 A commit B C rollback
- 6.⼀一个典型的微服务架构应⽤用 HTML Browser Front UI REST Mobile Device REST EdgeService Customer Service Order Service Inventory Service Customer Database Order Database Inventory Databasehttp://microservices.io/patterns/data/database-per-service.htmlhttp://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/
- 7.两阶段提交 2PC Transaction Manager RM 1 prepare() OK prepare() OK commit() OK commit() OK RM 2 • 提供强⼀一致保障 • 准备阶段完成资源操作 • 如果准备过程中出现问题,可以回滚 • 提交阶段不不允许出错 • 资源层⾯面提供保障业务侵⼊入性低 • 协议成本⾼高,并且存在全局锁的问题
- 8.ACID 与 BASE • ACID (刚性事务) • 原⼦子性 (Atomicity) • BASE (柔性事务) • 基本可⽤用(Basically Available) • ⼀一致性 (Consistency) • 隔离性 ( Isolation) • 柔性状态 (Soft state) • 最终⼀一致性 (Eventually Consistent) • 持久性 (Durability)https://queue.acm.org/detail.cfm?id=1394128
- 9.try confirm cancel 业务服务 TCC •Try:尝试执⾏行行业务 • 完成所有业务检查,预留留必须的业务资源 • Confirm:确认执⾏行行业务 • 真正执⾏行行业务,不不做业务检查 • Cancel:取消执⾏行行业务 • 释放Try阶段预留留的业务资源
- 10.通过领域建模来解决
- 11.微服务事务⼀一致性建议 • 内刚 • 微服务内:聚合通过数据库事务保证强⼀一致 • 外柔 • 微服务间:最终⼀一致
- 12.Saga简介 • 1987年年Hector & Kenneth 发表论⽂文 Sagas • Saga = Long Live Transaction (LLT) • LLT = T1 + T2 + T3 + ... + Tn • 每个本地事务Tx 有对应的补偿 Cx T1 T2 T3 ... Tn C1 C2 C3 ... Cn T1 T2 T3 ... Tn 正常情况 T1 T2 T3 C3 C2 C1 异常情况https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf
- 13.业界Saga的研究应⽤用情况 Caitie McCaffrey Distributed Sagashttps://github.com/aphyr/dist-sagas/blob/master/sagas.pdfChris Richardson Microservice saga patternhttp://microservices.io/patterns/data/saga.html
- 14.Saga Started Flight Started Flight Ended Hotel Started Hotel Ended Car Started Car Ended Payment Started Payment Ended Saga Ended request Saga StartSaga EndSaga
- 15.Saga Started Flight Started Flight Ended Hotel Started Hotel Aborted Flight Compensated Saga Ended request Saga StartSaga Transaction Rollback EndSaga
- 16.对服务的要求 • 幂等 T = T T … T time saga car rental T T'
- 17.对服务的要求 • 幂等 T = T T … T time saga car rental T T' • 可交换补偿 T C = T C T time saga car rental T T' C 保留留所有事务数据!
- 18.ACID 与 Saga • ACID • 原⼦子性 (Atomicity) • ⼀一致性 (Consistency) • 隔离性 ( Isolation) • 持久性 (Durability) • Saga只提供ACD保证 • 原⼦子性(通过Saga协调器器实现) • ⼀一致性 (本地事务 + Saga log) • 隔离性 (Saga不不保证) • 持久性 (Saga log)
- 19.缺乏隔离性带来的问题 • 两个Saga事务同时操作⼀一个资源会出现数据语义不不⼀一致的的情况。 • 两个Saga事务同时操作⼀一个订单 ,彼此操作会覆盖对⽅方(更更新丢失) • 两个Saga事务同时访问扣款账号,⽆无法看到退款 (脏读取问题) • 在⼀一个Saga事务内,数据被其他事务修改前后的读取值不不⼀一致(模糊 读取问题)http://microservices.io/microservices/general/2018/03/22/microxchg-sagas.html
- 20.如何应对隔离性问题 • 隔离的本质是控制并发,防⽌止并发事务操作相同资源⽽而引起结果错乱 • 在应⽤用层⾯面加⼊入逻辑锁的逻辑。 • Session层⾯面隔离来保证串串⾏行行化操作。 • 业务层⾯面采⽤用预先冻结资⾦金金的⽅方式隔离此部分资⾦金金。 • 业务操作过程中通过及时读取当前状态的⽅方式获取更更新。
- 21.Saga的实现⽅方式 • 集中式的实现⽅方式 (Orchestration-based coordination) • 集中式协调器器负责服务调⽤用以及事务协调 • 分布式的实现⽅方式 (Choreography-based coordination) • 通过事件驱动的⽅方式来进⾏行行事务协调http://microservices.io/patterns/data/saga.html
- 22.集中式Saga实现 //transaction invocation action Order Servfircoem("direct:creditReservation") .saga() Customer Service .propagation(SagaPropagation.SUPPORTS) Ord.eorpSteirovnic(e"CreditId", body()) // mark the current body as needed in the compensating action .co..mblpeoeagnn("s(Cacrtrceierdodeiniat(t"Ste$de{ir()hrveeiaccdtee:,rc".rraeemdsoieutrernRvtese}feCurrrnveededs")ieCtrr"ve)edd.it(C)ustom Id CustomerService ucsreeddiitLsim$ it create{(b)ody}");CreateOrder // called onSlaygaif the saga iscrceadnciteRlelesderved() from("direct:creditRefund") creditReservate .transform(header("CreditId")) // retrieve the Credit…Id option from headers .bean(creditService, "refundCredit") .Olrodge(r"Credit for Custom Id ${body} refunded"); state total …https://github.com/apache/camel/blob/master/camehl-cttopre://s/rmc/imcarion/sdeorcvs/iecipess/s.iaog/ap-eaiptt.eadrnocs/data/saga.html
- 23.Create Order 分布式Saga实现 Order created Order Service create() approve()/reject() Order state total … Credit Reserved Customer Service OR Credit Limit Exceeded reserveCredit() Customer creditLimit creditReservations …http://microservices.io/patterns/data/saga.htmlhttp://www.axonframework.org/docs/2.0/sagas.html
- 24.Service Center Java Chassis 让云原⽣生应⽤用开发更更简单 代码:https://github.com/apache?q=incubator-servicecomb⽹网站:http://servicecomb.incubator.apache.org/华为云:https://www.huaweicloud.com/product/cse.htmlSaga
- 25.ServiceComb Saga演进 Caller params {T1:'>T1: