中间件Zookeep--分布式锁

简介: 中间件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最佳实践,帮助读者更好地理解和应用分布式中间件。
878 103
|
3月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的&quot;神经网络&quot;,强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
265 3
|
消息中间件 数据库
消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)
消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)
353 0
|
负载均衡 中间件 数据库
中间件分布式事务的挑战
【7月更文挑战第19天】
234 9
|
消息中间件 运维 Linux
运维最全Linux 命令大全之scp命令_linux scp 指令(1),2024年最新从消息中间件看分布式系统的多种套路
运维最全Linux 命令大全之scp命令_linux scp 指令(1),2024年最新从消息中间件看分布式系统的多种套路
|
关系型数据库 中间件 分布式数据库
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS自制脑图, Distribute Relational Database Service(DRDS)是分布式关系型数据库,它主要是一种水平拆分、可平滑扩容、读写分离的在线分布式数据库服务。
529 74
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS
|
运维 监控 Dubbo
阿里云互联网中间件五剑客之——企业级分布式应用服务EDAS
阿里云互联网中间件五剑客之——企业级分布式应用服务EDAS自制脑图, 企业级分布式应用服务 EDAS(Enterprise Distributed Application Service)是一个应用托管和微服务管理的 PaaS 平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持 Spring Cloud、Apache Dubbo(以下简称 Dubbo )、HSF 等微服务运行环境,助力您的各类应用轻松上云。
626 87
阿里云互联网中间件五剑客之——企业级分布式应用服务EDAS
|
SQL JSON Oracle
阿里分布式中间件Seata从入门到精通
阿里分布式中间件Seata从入门到精通
719 101
阿里分布式中间件Seata从入门到精通
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)