面试题之五
请谈谈对分布式锁的理解和实现?
难度指数:四星级
考察频率:85%
开发年限:3-5年
一.概念
分布式锁:是一种跨进程、机器节点的互斥锁,可以用来保证多台机器接待对于共享资源的访问排它性。
和线程本质上是一样的,线程锁的生命周期是单进程多线程,分布式锁的生命周期是多进程多机器节点。
本质上:需要满足锁的几个特性:
1)排它性:同一个时刻只能有一个节点访问资源。
2)可重入性:允许一个获得锁的进程,在没有释放锁之前重新获得锁。
3)锁的获取、释放的方法。
4)锁:失效机制、从而避免死锁的情况。
只要满足上述这些特性的技术组件,都可以实现分布式锁。
二.实现
1)RDBMS:如何来实现锁的排它性。唯一约束。
针对某个方法加锁,建一个表,方法名作为字段,设置其为唯一约束。
抢占锁的逻辑:插入一条数据,如果有其他线程获得了某个方法的锁,那么这个时候插入数据fail,从而保证互斥性。这种实现方式比较简单,考虑重入性,锁失效机制,阻塞机制,比较麻烦。
2)Redis,指令:SETNX命令,可以实现锁的排它性。如果锁不存在,则返回1,存在则返回0,可以设置过期失效时间(expire),可以避免死锁问题。
锁过期,但是业务逻辑还没有结束。这种情况下,写一个定时任务,对指定的key进行续约。
Redisson这个开源组件,就提供了分布式锁的封装实现,并且也内置了一个WatchDog机制对key做续约。
99%,解决问题。
高可用集群可能由于场景(主从切换)导致key失效,这种情况可能由于多个线程抢占同一个锁资源,Redis官方提供了一个RedLock的解决方案。
3)本质CP模型,(一致性、分区容错特性),Redis(AP模型),由于数据一致性问题,会导致出现多个线程抢占到锁的情况很难避免。CP模型下实现分布式锁的特性,Zookeeper。
4)数据一致性,ZAB协议保证(Zookeeper Atomic Broadcase)原子广播协议,通过ZAB协议可以保证集群主 从节点的数据同步、从而保证数据一致性。
5)Zookeeper基于有序节点,再加上Watch机制实现互斥和唤醒操作。
思考
分布式系统和并发安全的理解。
技术底层
标签:实现,Zookeeper,谈谈,理解,线程,一致性,节点,分布式 From: https://blog.51cto.com/teayear/8987738