分布式锁选型背后的架构设计思维附源码
Posted 架构之美
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式锁选型背后的架构设计思维附源码相关的知识,希望对你有一定的参考价值。
1. 分布式锁本质
-
业务协调 -
业务幂等(需配合业务代码实现) -
共享资源竞争
-
强一致性 -
服务高可用、系统稳健 -
锁自动续约、自动释放 -
业务可重入
2. 分布式锁存储选型及场景
高可用:Redis是一个K-V存储,使用主从模式进行集群,Redis Cluster 底层也是主从模式的组合,性能高,保证了高可用。ZooKeeper是Tree的数据结构,节点要求N + 1,N必须大于2,通过ZAB选举保障主的可用。etcd是一个K-V存储,节点要求N + 1,N必须大于2,通过Raft选举保障主的高可用。
3. 分布式锁接口设计
* @方法名称 lock
* @功能描述 <pre>获取锁</pre>
* @param ttl 锁过期时间,单位毫秒
* @return true-获取锁,false-为获得锁
* @throws RuntimeException 操作锁失败,需要业务判断是否重试
*/
boolean lock(int ttl) throws RuntimeException;
* @方法名称 acquire
* @功能描述 <pre>竞争锁,并自动续租</pre>
* @param ttl 锁过期时间,单位毫秒
* @return true-获取锁,false-为获得锁
* @throws RuntimeException 操作锁失败,需要业务判断是否重试
*/
default boolean acquire(int ttl)
throws RuntimeException {
if (lock(ttl)) {
logger.debug(MSG_LOCK, getName());
startHeartBeatThread();
return true;
}
return false;
}
* @方法名称acquireOrWait
* @功能描述 <pre>竞争锁或等待锁</pre>
* @param ttl 锁过期时间,单位毫秒
* @param waitTime 等待时间,单位毫秒
* @return true-获取锁,false-为获得锁
* @throws InterruptedException
* @throws RuntimeException 操作锁失败,需要业务判断是否重试
*/
default boolean acquireOrWait(int ttl, int waitTime)
throws InterruptedException,RuntimeException {
while (!lock(ttl)) {
waitTime =waitTime - ttl / 2;
Thread.sleep(ttl / 2);
if (waitTime<= 0) {
logger.debug(MSG_LOCK_TIMEOUT, getName());
return false;
}
}
startHeartBeatThread();
return true;
}
* @方法名称startHeartBeatThread
* @功能描述 <pre>续租心跳</pre>
*/
void startHeartBeatThread();
* @方法名称 close
* @功能描述 <pre>释放锁</pre>
*/
@Override
void close();
/**
* @方法名称 release
* @功能描述 <pre>释放锁</pre>
*/
default void release() {
close();
}
4. AP模型的Redis分布式锁实现
5. CP模型的etcd分布式锁实现
-
prevExits:检查是否存在,true:新增,false:更新; -
prevIndex:检查上一个的key,既操作返回的uuid; -
prevValue:检查上一个的值;
-
取锁:curl http://ip:port/v2/keys/锁名 -XPUT -d ttl=10 -d prevExits=false -d value=锁值 -
续租:curl http://ip:port/v2/keys/锁名?prevValue=锁值 -XPUT -d ttl=3 -dprevExits=true -d refresh=true -
释放锁:curl http://ip:port/v2/keys/锁名?prevValue=锁值 -XDELETE
6. CP模型的etcd分布式锁实现源码
以上是关于分布式锁选型背后的架构设计思维附源码的主要内容,如果未能解决你的问题,请参考以下文章
京东技术:如何实现靠谱的分布式锁?(附SharkLock的设计选择)
Zookeeper详细使用解析!分布式架构中的协调服务框架最佳选型实践