思考的点:
需要这个锁独立于每一个服务之外,而不是在服务里面。数据库:利用主键冲突控制一次只有一个线程能获取锁,非阻塞、不可重入、单点、失效时间
zk通过临时节点,解决了死锁的问题,一旦客户端获取到锁之后突然挂掉(Session连接断开),那么这个临 时节点就会自动删除掉,其他客户端自动获取锁。临时顺序节点解决羊群效应
setNX,单线程处理网络请求,不需要考虑并发安全性 所有服务节点设置相同的key,返回为0、则锁获取失败
setnx 问题:
可参考文章:面试官:你真的了解Redis分布式锁吗?
redlock:意思的机制都只操作单节点、即使Redis通过sentinel保证高可用,如果这个master节点由于 某些原因发生了主从切换,那么就会出现锁丢失的情况(redis同步设置可能数据丢失)。redlock从多 个节点申请锁,当一半以上节点获取成功、锁才算获取成功,redission有相应的实现
image.png
**说明:** 第一阶段( prepare ) :每个参与者执行本地事务但不提交,进入 ready 状态,并通知协调者已经准备就绪。 第二阶段( commit ) 当协调者确认每个参与者都 ready 后,通知参与者进行 commit 操作;如果有 参与者 fail ,则发送 rollback 命令,各参与者做回滚。问题:
主要是针对两阶段的优化,解决了2PC单点故障的问题,但是性能问题和不一致问题仍然 没有根本解决
引入了超时机制解决参与者阻塞的问题,超时后本地提交,2pc只有协调者有超时机制
Try、Confirm、Cancel 针对每个操作,都要注册一个与其对应的确认和补偿(撤销)。
TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有 分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中 Confirm/Cancel操作若执行失败,TM会进行重试。TCC模型对业务的侵入性较强,改造的难度较大,每个操作都需要有 try 、 confirm 、 cancel 三个接 口实现 confirm 和 cancel 接口还必须实现幂等性。 消息队列的事务消息: