当前位置:   article > 正文

ZooKeeper实现分布式锁_zk实现分布式锁

zk实现分布式锁

一、分布式锁的概念

我们有三个系统,系统A是由Java开发的,系统B是由PHP开发的,系统C是由.net开发的。锁共享的资源是什么了,就是我们所说的数据库当中的某张表,这张表出现了最终数据的不一致的问题。

以下订单为例,假设当前有10个库存,一次请求下订单(6个)的时候创建订单后去扣除库存速度变慢了,那么下一个请求过来的时候去查询库存就发现库存还是10个,然后也会去执行创建订单和扣除库存这么一个操作,最终两个请求都成功了,库存变为-2,和实际生活不一致,这个时候就需要引入分布式锁

二、分布式锁方案

第一种:数据库中构建一张表,利用表种的字段值1或者0来判断该操作是否可执行

第二种:利用Redis的setnx key value,设置有效期

第三种:利用Zk的临时节点,countdownlacth原子工具类,上锁和解锁

单机:Redis效率更高,基本内存

分布式:偏爱ZK,Redis的数据同步机制实时性相比zk要低很多

三、Zooker实现分布式锁的原理步骤

第一步:首先在根路径下面创建好ZK命名空间

第二步:在该命名空间下创建好其中一个锁的节点(永久)imooc-locks,称之为分布式锁的总节点

第三步:对上述锁节点(即真正要监听节点的父节点进行监控)创建监听事件(addWatcherToLock)

监听子节点是否已被移除,如果是的话,则触发同步计数器(countdownlatch)的自减操作,当countdownlacth的值为0的时候,前面阻塞的线程就可以继续往下执行了,即分布式的请求可以执行了。

释放锁操作:就是删除字节点

代码中使用:

1.执行订单流程之前当前业务获得分布式锁

distributedLock.getLock();

2.在一个业务流程可能结束的时间将这把锁给释放

//释放锁,让下一个请求获得锁
distributedLock.releaseLock();
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/634945
推荐阅读
相关标签
  

闽ICP备14008679号