面试官问到分布式事务?这样回答就对了!

开发 架构
1. 通过本地消息表+job重试对账+下游(接口幂等、提供接口的校验)+(打印日志+告警+人工介入补偿)基于本地消息表实现分布式事务基于mq实现柔性分布式事务。

小王面试某互联网公司高级开发岗位,介绍项目的时候,谈到公司业务量和研发团队暴增后,自己主导完成公司项目的架构升级,从传统的单体架构升级到微服务架构,面试官接下来就问了一道经典面试题:你们架构升级过程中,分布式事务是如何解决的?请介绍一下。

看重点

主要围绕三个大方向:

1. 事务相关概念介绍;

 2. 分布式事务常见方案;

 3. 柔性事务之最大努力通知型落地实现;

1.事务相关概念介绍

事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。

单事务概念

应用多次数据库操作,通过用事务进行管理,来保证ACID原则。

原子性(A):操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。

一致性(C):事务的执行使数据从一个状态转换为另一个状态,事务在执行之前和之后,数据库都必须处于一致性状态。

隔离性(I):在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。

持久性(D):当事务正确完成后,它对于数据的改变是永久性的。

分布式事务概念

  1. 单应用内部调用(多个数据源调用,操作多个库)以某业务的动态折扣业务场景为例:动态折扣规则-运营后台配置(配置库)用户享受的动态折扣-用户折扣记录(按userId分片的分片库,120个)
  2. 涉及多应用调用(有可能操作同一个数据源,也有可能操作不同的数据源)以某业务用户抵扣可用优惠场景为例:用户 -> 查询可用优惠 -> 支付订单 -> 调用动态折扣系统抵扣 -> 调用优惠券系统抵扣

CAP理论

C:一致性,数据一致性:强一致性、弱一致性、最终一致性。

强一致性:流程涉及的各个环节数据必须实时一致性

弱一致性:流程涉及的各个环节数据允许存在部分数据不一致

最终一致性:允许存在中间状态,只要求经过一段时间后,数据最终是一致的

A:可用性:系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。

P:分区容错性(一定会存在):分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务。

无法同时满足CAP,常见组合:AP:互联网业务  CP:金融业务

base理论

base理论是CAP理论中AP方案的延伸,核心思想是即时无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。

Basically Available(基本可用)Soft state(软状态,中间状态)Eventually consistent(最终一致性)

2.分布式事务常见方案

分布式场景下,多个服务同时对服务一个流程,比如电商下单场景,需要支付服务进行支付、库存服务扣减库存、订单服务进行订单生成、物流服务更新物流信息等。如果某一个服务执行失败,或者网络不通引起的请求丢失,那么整个系统可能出现数据不一致的原因。

常见方案:

1. 设计方案尽可能规避分布式事务方案(相似的业务放在一起,不要过度拆分)

2. 强事务(CP, 低并发短事务)和柔性事务(AP,高性能)

强事务:满足CP理论,XA协议(2PC、JTA、JTS)、3PC,但由于同步阻塞,处理效率低,适合低并发、短事务业务。

2PC:Seeta(AT)、LCN(2PC),适合分布式系统   JTA:atomikos(适合单系统多数据源)

柔性事务:满足AP,base理论,适合异步更新数据,并且对数据的实时性要求较低的场景,主要分为: .补偿型(TCC、saga) .最大努力通知型(MQ、本地消息表) .异步确保型(MQ、本地消息表)

实现方式:TCC(seeta-tcc,lcn-tcc)、Saga(seeta-saga状态机模式、Aop模式)、本地事务消息、事务消息MQ

互联网业务,一般的流量比较大,涉及很多高并发场景,我们一般采用柔性事务,这样系统的性能好。

3.柔性事务之最大努力通知型落地实现

互联网应用最广泛:

  1. 重试:通过本地消息表+job重试对账+下游(接口幂等、提供接口的校验)+(打印日志+告警+人工介入补偿)基于本地消息表实现分布式事务基于mq实现柔性分布式事务。
  2. 回滚:1)程序捕获异常,调用回滚代码  2)发送回滚MQ,各个系统消费MQ,调用本地回滚方法。
责任编辑:武晓燕 来源: 不码不疯魔
相关推荐

2021-06-03 08:55:54

分布式事务ACID

2019-12-09 10:37:27

Hash算法面试

2022-08-11 18:27:50

面试Redis分布式锁

2022-04-19 07:31:28

事务隔离机制数据库

2022-11-25 17:29:27

分布式事务

2020-09-27 06:52:22

分布式存储服务器

2018-10-12 09:42:00

分布式锁 Java多线

2024-02-22 17:02:09

IDUUID雪花算法

2020-06-17 21:22:56

Serverless面试官架构

2020-12-03 06:30:11

内部类对象变量

2022-06-27 08:21:05

Seata分布式事务微服务

2021-01-08 09:14:59

分布式事务框架

2022-06-21 08:27:22

Seata分布式事务

2017-07-26 15:08:05

大数据分布式事务

2022-10-09 08:38:17

消息队列面试官模式

2021-10-22 08:37:13

消息不丢失rocketmq消息队列

2023-01-12 08:24:45

ZookeeperZK服务器

2019-10-10 09:16:34

Zookeeper架构分布式

2019-05-14 08:44:13

面试面试官线程安全

2021-11-03 11:58:44

分布式事务面试
点赞
收藏

51CTO技术栈公众号