开发者社区> 知识浅谈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

zookeeper实现分布式锁实战

简介: zookeeper实现分布式锁实战
+关注继续查看

zookeeper实现分布式锁实战

分布式锁

分布式锁(多服务共享锁) 在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问。

对于一个分布式系统中同一个方法,如果多个线程同时访问,对数据库的修改会产生错误,所以就需要在整个分布式系统上的多线程同时访问造成数据错误的代码段或者说方法上加分布式锁。

分布式锁的种类

  1. 基于数据库本身的锁
  2. 基于redis中的setnx的锁
  3. 基于zookeeper的分布式锁

zookeeper分布式锁

image

因为zookeeper的结构是一个树形的结构,所以使用zokeeper实现分布式锁的方式就是,建立锁就是建立一个文件夹,然后多线程要获取分布式锁的过程中,可以在这个锁(也就是文件夹)下创建一个个有序的文件,代表获取锁的多线程的顺序。

如下实现原理:

image

zookeeper实战

使用docker安装安装zookeeper

docker run --name some-zookeeper -d --privileged=true -p 2181:2181 -p 8080:8080 zookeeper:latest

启动后:访问http://ip:8080/commands

image

代表启动成功

创建springboot项目并引入依赖

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

实现zookeeper分布式锁

@RestController
public class zookeeperTest {
    @RestController
    public class TestControl {
        private int a = 10;
        @RequestMapping("/test")
        public String test() throws Exception {
            //设置zk的客户端重试策略 每隔5秒重试一次,最多10次
            RetryPolicy policy = new ExponentialBackoffRetry(5000, 10);
            //创建zk客户端 链接zookeeper服务器
            CuratorFramework client = CuratorFrameworkFactory.builder().connectString("ip(改成自己的):2181").retryPolicy(policy).build();
            //创建与zookeeper服务器的连接
            client.start();
            //声明锁的对象,本质就是ZK顺序临时节点
            final InterProcessMutex mutex = new InterProcessMutex(client, "/lock/shoe");
            try {
                //请求锁,创建锁
                mutex.acquire();
                if(a>0){
                    Thread.sleep(500);
                    return "你抢到了"+(a--);
                }else{
                       return "商品已无";
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                mutex.release();
            }
            return "null";
        }
    }
}

启动项目使用jmeter测试

  1. 创建线程组并设置线程数为15

image

2. 创建http请求

image

3. 创建结果树(便于查看请求结果)

image

  1. 查看zookeper的树结构的节点

image

可以看出文件树是有序的,也就是需要执行一个之后再执行其他的,并发度降低了,所以适合并发小的程序。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Zookeeper从0到1实现一个分布式锁
分布式锁,在实际的业务使用场景中算是比较常用的了,而分布式锁的实现,常见的除了redis之外,就是zk的实现了,前面一篇博文介绍了zk的基本概念与使用姿势,那么如果让我们来记住zk的特性来设计一个分布式锁,可以怎么做呢?
44 0
漫画:如何用Zookeeper实现分布式锁?
1.持久节点 (PERSISTENT) 默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在 。 2.持久节点顺序节点(PERSISTENT_SEQUENTIAL) 所谓顺序节点,就是在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号:
32 0
zookeeper分布式锁原理及实现(1)
zookeeper分布式锁原理及实现(1)
28 0
zookeeper分布式锁原理及实现(2)
zookeeper分布式锁原理及实现(2)
30 0
分布式锁的3种实现(数据库、缓存、Zookeeper)
分布式锁的几种实现方式 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。
1771 0
基于ZooKeeper实现分布式锁
ZooKeeper 保证了数据的强一致性,  zk集群中任意节点(一个zkServer)上的相同znode下的数据一定是相同的。使用zookeeper可以非常简单的实现分布式锁, 其基本逻辑如下: 客户端调用create()方法创建名为“locknode/lock”的节点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。
902 0
+关注
知识浅谈
🍁 作者:知识浅谈,CSDN签约讲师,阿里云社区专家博主,CSDN原力作者,后端领域优质创作者,热爱分享创作 💒 公众号:知识浅谈 📌 擅长领域:全栈工程师、爬虫、ACM算法 🔥 联系方式vx:zsqtcc
66
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载