JAVA分布式服务常见面试题
分布式事务
Seata
seata是阿里开源的分布式事务调度框架,支持TCC、AT、SAGA、XA四种模式
AT
SEATA默认是AT模式,通过@GlobalTrancation 动态代理生成全局事务ID,并通过RM来管理全局事务,如中间出错需要回滚事务时则通过数据库中的undo-log回写,undolog记录了数据提交前的状态XA
二阶段提交,需要数据库本身支持XA协议TCC
即 尝试(Try)-确认(Confirm)-取消(Cancel),每个事务都分成这三个阶段,在提交事务前向另一个系统发送确认消息,两边系统都确认OK了才执行提交操作,有一方出现异常则执行Cancel(补偿方法),缺点在于三个方法都需要自已手动完成SAGA
与TCC类似,不同点在于一阶段直接提交事务,失败则执行补偿操作,无锁,因此性能相对较好,但同时由于没有事务隔离性会带来赃写
分布式锁
基于数据库的CAS乐观锁
更新数据的时候带上指定版本号,如果被其他线程提前更新的版本号,则此次更新失败,缺点对数据库表侵入较大,每个表需要增加version字段,高并发下存在很多更新失败。
通过redis实现
使用命令 SET key value NX PX milliseconds
缺点:
- 获取锁是非阻塞
- 非公平锁,不支持需要公平锁的场景
- redis主从存在延迟,在master宕机发生主从切换时,可能会导致锁失效
改进:
基于Redlock算法实现分布式锁。 redisson对Redlock算法进行了封装。
简单来说就是同时向多个节点发送锁定命令,当获取锁时由于是多个节点会有时间差问题。
**客户端计算获取锁所花的时间,只有当客户端在大多数master节点上成功获取了锁,而且总共消耗的时间不超过锁释放时间,这个锁就认为是获取成功了 **
基于zookeeper实现分布式锁
- 本文作者: reiner
- 本文链接: https://reiner.host/posts/4320.html
- 版权声明: 转载请注明出处,并附上原文链接