zookeeper实现分布式锁实战

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: zookeeper实现分布式锁实战

zookeeper实现分布式锁实战

分布式锁

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

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

分布式锁的种类

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

zookeeper分布式锁

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

如下实现原理:

zookeeper实战

使用docker安装安装zookeeper

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

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

代表启动成功

创建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

2. 创建http请求

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

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

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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
11天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
30 2
|
3月前
|
消息中间件 Java 网络安全
JAVAEE分布式技术之Zookeeper的第一次课
JAVAEE分布式技术之Zookeeper的第一次课
70 0
|
1月前
|
监控 NoSQL Java
Zookeeper分布式锁
Zookeeper分布式锁
90 1
|
2月前
|
消息中间件 RocketMQ 微服务
RocketMQ 分布式事务消息实战指南
RocketMQ 分布式事务消息实战指南
253 1
|
2月前
|
Java 数据库连接 API
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
56 0
|
25天前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
28 1
|
2月前
|
Java Linux Spring
Zookeeper实现分布式服务配置中心
Zookeeper实现分布式服务配置中心
48 0
|
2月前
|
存储 分布式计算 Hadoop
ZooKeeper初探:分布式世界的守护者
ZooKeeper初探:分布式世界的守护者
64 0
|
2月前
|
NoSQL Java API
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
298 0
|
3月前
|
监控 前端开发 Java
JAVAEE分布式技术之Zookeeper技术
JAVAEE分布式技术之Zookeeper技术
16 0
JAVAEE分布式技术之Zookeeper技术

热门文章

最新文章