ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
云原生网关 MSE Higress,422元/月
简介: 分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的。

前言


分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的。


使用 Demo

public class CuratorDemo {
    public static void main(String[] args) throws Exception {
        String connectString = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework client = CuratorFrameworkFactory
                .builder()
                .connectString(connectString)
                .retryPolicy(retryPolicy)
                .build();
        client.start();
        InterProcessSemaphoreV2 semaphore = new InterProcessSemaphoreV2(client, "/semaphores/semaphore_01", 3);
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread() + " 线程 start - " + LocalTime.now());
                    Lease lease = semaphore.acquire();
                    System.out.println(Thread.currentThread() + " 线程 execute - " + LocalTime.now());
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread() + " 线程 over -" + LocalTime.now());
                    semaphore.returnLease(lease);
                } catch (Exception e) {
                }
            }).start();
        }
        Thread.sleep(1000000);
    }
}


控制台输出数据如下:

网络异常,图片无法展示
|


源码


获取凭证

核心源码:InterProcessSemaphoreV2#internalAcquire1Lease

这里仅介绍大概逻辑,有兴趣的小伙伴可以自行阅读源码。

网络异常,图片无法展示
|


lock 是 InterProcessMutexInterProcessSemaphoreV2 信号量,也是借助于最基础的加锁。

网络异常,图片无法展示
|


通过图也可以看出,使用 InterProcessSemaphoreV2 时,会先创建 /semaphores/semaphore_01 路径,并在路径下创建 locks 节点。也就是 /semaphores/semaphore_01/locks 路径下,有 10 个临时顺序节点。

网络异常,图片无法展示
|


紧接着会在 /semaphores/semaphore_01 路径下创建 leases 节点,所以创建锁的临时顺序节点之后,会紧接着在 /semaphores/semaphore_01/leases 下创建临时顺序节点。

网络异常,图片无法展示
|


/semaphores/semaphore_01/leases 节点进行监听,同时获取 /semaphores/semaphore_01/leases 下面的子节点数量。

  1. 如果子节点数量小于等于信号量计数,则直接结束循环;
  2. 如果大于,则会进入 wait 等待唤醒。


释放凭证

网络异常,图片无法展示
|

释放凭证就是调用 Lease 的 close 方法,删除节点,这样 /semaphores/semaphore_01/leases 上的监听器就会触发,然后其他线程获取凭证。


互斥锁

互斥锁 InterProcessSemaphoreMutex,不支持重入,其他的和可重入锁并没有什么区别。就是基于 InterProcessSemaphoreV2 实现的。

网络异常,图片无法展示
|

就是把计数的值 maxLeases 设置为了 1。


总结


信号量 InterProcessSemaphoreV2 其实是通过判断节点下的子节点数量来实现控制信号量,同时内部加锁是基于可重入锁 InterProcessMutex 实现的。

互斥锁 InterProcessSemaphoreMutex 则是将信号量的技术设置为 1 来实现互斥功能。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
4月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
4月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
4天前
|
SQL Java 关系型数据库
【📕分布式锁通关指南 01】从解决库存超卖开始加锁的初体验
本文通过电商场景中的库存超卖问题,深入探讨了JVM锁、MySQL悲观锁和乐观锁的实现及其局限性。首先介绍了单次访问下库存扣减逻辑的正常运行,但在高并发场景下出现了超卖问题。接着分析了JVM锁在多例模式、事务模式和集群模式下的失效情况,并提出了使用数据库锁机制(如悲观锁和乐观锁)来解决并发问题。 悲观锁通过`update`语句或`select for update`实现,能有效防止超卖,但存在锁范围过大、性能差等问题。乐观锁则通过版本号或时间戳实现,适合读多写少的场景,但也面临高并发写操作性能低和ABA问题。 最终,文章强调没有完美的方案,只有根据具体业务场景选择合适的锁机制。
24 12
|
26天前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
1月前
|
NoSQL Java Redis
秒杀抢购场景下实战JVM级别锁与分布式锁
在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极高的要求。特别是在秒杀开始的瞬间,系统需要处理海量的并发请求,同时确保数据的准确性和一致性。 为了解决这些问题,系统开发者们引入了锁机制。锁机制是一种用于控制对共享资源的并发访问的技术,它能够确保在同一时间只有一个进程或线程能够操作某个资源,从而避免数据不一致或冲突。在秒杀抢购场景下,锁机制显得尤为重要,它能够保证商品库存的扣减操作是原子性的,避免出现超卖或数据不一致的情况。
63 10
|
2月前
|
存储 运维 NoSQL
分布式读写锁的奥义:上古世代 ZooKeeper 的进击
本文作者将介绍女娲对社区 ZooKeeper 在分布式读写锁实践细节上的思考,希望帮助大家理解分布式读写锁背后的原理。
|
3月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
72 2
|
3月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
71 1
|
3月前
|
运维 NoSQL 关系型数据库
基于Zookeeper的锁
【10月更文挑战第2天】
27 0
|
3月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
64 0

热门文章

最新文章