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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
124 2
|
1月前
|
存储 分布式计算 大数据
HBase分布式数据库关键技术与实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析了HBase的核心技术,包括数据模型、分布式架构、访问模式和一致性保证,并探讨了其实战应用,如大规模数据存储、实时数据分析及与Hadoop、Spark集成。同时,分享了面试经验,对比了HBase与其他数据库的差异,提出了应对挑战的解决方案,展望了HBase的未来趋势。通过Java API代码示例,帮助读者巩固理解。全面了解和掌握HBase,能为面试和实际工作中的大数据处理提供坚实基础。
48 3
|
2月前
|
监控 Dubbo 前端开发
快速入门分布式系统与Dubbo+zookeeper Demo
快速入门分布式系统与Dubbo+zookeeper Demo
42 0
|
2月前
|
监控 NoSQL Java
Zookeeper分布式锁
Zookeeper分布式锁
90 1
|
3月前
|
消息中间件 RocketMQ 微服务
RocketMQ 分布式事务消息实战指南
RocketMQ 分布式事务消息实战指南
310 1
|
5天前
|
存储 大数据 Apache
深入理解ZooKeeper:分布式协调服务的核心与实践
【5月更文挑战第7天】ZooKeeper是Apache的分布式协调服务,确保大规模分布式系统中的数据一致性与高可用性。其特点包括强一致性、高可用性、可靠性、顺序性和实时性。使用ZooKeeper涉及安装配置、启动服务、客户端连接及执行操作。实际应用中,面临性能瓶颈、不可伸缩性和单点故障等问题,可通过水平扩展、集成其他服务和多集群备份来解决。理解ZooKeeper原理和实践,有助于构建高效分布式系统。
|
10天前
|
监控 NoSQL 算法
探秘Redis分布式锁:实战与注意事项
本文介绍了Redis分区容错中的分布式锁概念,包括利用Watch实现乐观锁和使用setnx防止库存超卖。乐观锁通过Watch命令监控键值变化,在事务中执行修改,若键值被改变则事务失败。Java代码示例展示了具体实现。setnx命令用于库存操作,确保无超卖,通过设置锁并检查库存来更新。文章还讨论了分布式锁存在的问题,如客户端阻塞、时钟漂移和单点故障,并提出了RedLock算法来提高可靠性。Redisson作为生产环境的分布式锁实现,提供了可重入锁、读写锁等高级功能。最后,文章对比了Redis、Zookeeper和etcd的分布式锁特性。
111 16
探秘Redis分布式锁:实战与注意事项
|
1月前
|
Java 网络安全 Apache
搭建Zookeeper集群:三台服务器,一场分布式之舞
搭建Zookeeper集群:三台服务器,一场分布式之舞
47 0
|
2月前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
43 1
|
2月前
|
存储 缓存 监控
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
45 0