中间件Zookeep--分布式锁

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 中间件Zookeep--分布式锁

分布式锁作用

分布式锁,主要用于分布式环境下多线程环境下保证线程安全,达到保证数据最终一致性

ZK排他锁

排他锁也叫写锁或者独占锁,在加锁期间只有持锁线程能访问,其他线程均需等待锁的释放;ZK通过数据节点来表示一个锁,在获取锁的时候,通过创建临时节点(例如/lock)来获取锁,如果创建成功则该线程获取到锁,如果创建不成功那么该线程会在/lock节点下注册一个新的节点顺序节点(依次递增),以确保锁的公平性,同时该节点会监听前一个节点,如果收到前一个节点的删除通知,判断自己是否为序号最小,如果是则获取锁成功,否则还是等待状态。(为什么不直接监听/lock节点,而是在/lock节点下创建顺序节点?是因为避免羊群效应,避免/lock节点删除之后其它节点都会收到监听信息)

实现:

可用Curator的InterProcessMutex分布式可重入排他锁实现

代码:
publicclassZkInterProcessMutex {
privatestaticintcount=0;
publicstaticvoidmain(String[] args) {
StringznodeLock="/lock";
CuratorFrameworkzkClient=getZkClient();
InterProcessMutexlock=newInterProcessMutex(zkClient, znodeLock);
for (inti=0; i<5; i++) {
finalintj=i;
newThread(newRunnable() {
@Overridepublicvoidrun() {
try {
lock.acquire();
System.out.println("当前线程: "+Thread.currentThread().getName() +", count: "+count++);
Thread.sleep(1000);
                    } catch (Exceptione) {
e.printStackTrace();
                    } finally {
try {
lock.release();
                        } catch (Exceptione) {
e.printStackTrace();
                        }
                    }
                }
            }, "Thread: "+i).start();
        }
    }
privatestaticCuratorFrameworkgetZkClient() {
// zk ipStringzkServerAddress="192.168.0.138:2181";
// 重试策略RetryPolicyretryPolicy=newExponentialBackoffRetry(1000, 5, 5000);
// 创建zk链接CuratorFrameworkzkClient=CuratorFrameworkFactory.builder()
                .connectString(zkServerAddress)
                .sessionTimeoutMs(5000)
                .connectionTimeoutMs(5000)
                .retryPolicy(retryPolicy)
                .build();
zkClient.start();
returnzkClient;
    }
}

ZK共享锁

共享锁也叫读锁,允许资源被同时读操作,但是不允许同时进行读写操作或者同时进行写操作。ZK会在/lock节点下面创建读、写顺序节点 ,读类型节点 “XXXXX-READ_0000000620”,写类型节点 “XXXXX-WRIT_0000000621”,对于读请求如果该节点是最小节点或者当前节点是读节点并且前面的最小节点也都是读节点,则可以获取到锁,如果比自己小的节点中有写请求,则需要等待锁;对于写请求,如果是最小节点则获取到锁,如果不是最小节点则需要等待锁。

实现:

可用Curator的InterProcessReadWriteLock分布式可重入排他锁实现

代码:
publicclassZkInterProcessReadWriteLock {
privatestaticintcount=0;
publicstaticvoidmain(String[] args) {
StringznodeLock="/lock";
CuratorFrameworkzkClient=getZkClient();
InterProcessReadWriteLocklock=newInterProcessReadWriteLock(zkClient, znodeLock);
for (inti=0; i<5; i++) {
finalintj=i;
newThread(newRunnable() {
@Overridepublicvoidrun() {
try {
if (j%2==0) {
lock.writeLock().acquire();
System.out.println("当前线程: "+Thread.currentThread().getName() +", count: "+count++);
                        } else {
lock.readLock().acquire();
System.out.println("当前线程: "+Thread.currentThread().getName() +", count: "+count++);
                        }
Thread.sleep(1000);
                    } catch (Exceptione) {
e.printStackTrace();
                    } finally {
try {
if (j%2==0) {
lock.writeLock().release();
                            } else {
lock.readLock().release();
                            }
                        } catch (Exceptione) {
e.printStackTrace();
                        }
                    }
                }
            }, "Thread: "+i).start();
        }
    }
privatestaticCuratorFrameworkgetZkClient() {
// zk ipStringzkServerAddress="192.168.0.138:2181";
// 重试策略RetryPolicyretryPolicy=newExponentialBackoffRetry(1000, 5, 5000);
// 创建zk链接CuratorFrameworkzkClient=CuratorFrameworkFactory.builder()
                .connectString(zkServerAddress)
                .sessionTimeoutMs(5000)
                .connectionTimeoutMs(5000)
                .retryPolicy(retryPolicy)
                .build();
zkClient.start();
returnzkClient;
    }
}
目录
相关文章
|
消息中间件 存储 缓存
分布式中间件核心原理与RocketMQ最佳实践
随着互联网业务的不断扩展和复杂化,分布式系统的需求也越来越迫切。为了满足这一需求,分布式中间件应运而生。在分布式系统中,中间件的角色是协调和管理各个节点之间的通信和数据交换,它起到了桥梁的作用。本文将介绍分布式中间件的核心原理和RocketMQ最佳实践,帮助读者更好地理解和应用分布式中间件。
644 22
|
4月前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
88 3
|
7月前
|
负载均衡 中间件 数据库
中间件分布式事务的挑战
【7月更文挑战第19天】
91 9
|
9月前
|
消息中间件 运维 Linux
运维最全Linux 命令大全之scp命令_linux scp 指令(1),2024年最新从消息中间件看分布式系统的多种套路
运维最全Linux 命令大全之scp命令_linux scp 指令(1),2024年最新从消息中间件看分布式系统的多种套路
|
消息中间件 数据库
消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)
消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)
95 0
|
存储 缓存 Java
详解Zookeeper(铲屎官)在众多中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心解决方案
`ZooKeeper `是一个**开放源码的分布式协调服务**,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基于` Zookeeper` 实现诸如**数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列**等功能。
23176 11
详解Zookeeper(铲屎官)在众多中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心解决方案
|
9月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
运维 监控 Dubbo
阿里云互联网中间件五剑客之——企业级分布式应用服务EDAS
阿里云互联网中间件五剑客之——企业级分布式应用服务EDAS自制脑图, 企业级分布式应用服务 EDAS(Enterprise Distributed Application Service)是一个应用托管和微服务管理的 PaaS 平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持 Spring Cloud、Apache Dubbo(以下简称 Dubbo )、HSF 等微服务运行环境,助力您的各类应用轻松上云。
451 10
阿里云互联网中间件五剑客之——企业级分布式应用服务EDAS
|
关系型数据库 中间件 分布式数据库
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS自制脑图, Distribute Relational Database Service(DRDS)是分布式关系型数据库,它主要是一种水平拆分、可平滑扩容、读写分离的在线分布式数据库服务。
410 17
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS