zookeeper的API简单编程三---分布式共享锁的实现

Golang实现企业级AI智能体安全合规自动化检测系统 需求:自动化解析欧盟AI法案、中国网络安全法、美国NIST框架等多国法规,提取具体合规要求并映射到企业技术实现。技术挑战法规文本非结构化,语义复杂,存在大量法律术语与技术术语交叉多语言支持(中文、英文、欧盟24种官方语言)法规动态更新(平均每季度更新2-3次)架构创新性:提出了"规则引擎+AI模型+实时监控"的混合架构,兼顾了合规要求的明确性与智能体行为的动态性。性能突破:通过Golang协程、多级缓存、数据库优化等技术,实现了12,800 req/s的高吞吐量和38ms的低延迟。准确性提升。 阅读详情

此处的编程的目的是为了实现分布式共享锁,当很多台客户端访问同一个资源时,就需要共享锁来实现合理的访问秩序;

那么在zookeeper下的共享锁的实现如下代码

编程思想:

1.每个申请访问资源的客户端都要在zookeeper上注册一个临时序列节点,

2.比较每个节点的大小,最小的可以获得访问权限,访问结束后,结束程序或者重新申请访问,这样就要先删除该节点

3.其他客户端监听父节点是否有NodeChildrenChanged事件通知并且事件路径为父节点

4.收到通知后,获取父节点所有子节点,并与本节点进行对比,是否为最小

代码如下所示:

package bigdata.zksharelock;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Random;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;

import bigdata.zkserertest.zkClientss;

public class ShareLock {	
	private static final String connectString = "lanc05:2181,lanc06:2181,lanc07:2181";
	private static final int sessionTimeout =2000;
	private static final String parent = "/locks"; 
	private static final String child = "/lock";
	static ZooKeeper zk =null;
	private volatile String currentlock;
	
	public static void testparent() throws Exception{
		//判断是否存在这个父目录
		Stat exists = zk.exists(parent, false);
		//如果不存在则创建
		if(exists == null){
			zk.create(parent, "IIIII".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);	
			System.out.println(" not exit ,then create----");
		}		
	}

	public  void getconnect() throws Exception {
		zk =new ZooKeeper(connectString, sessionTimeout, new Watcher() {
			@Override
			public void process(WatchedEvent event) {
				try {
					System.out.println(event.getType()+ "+++++++"+ event.getPath());
					//监听事件为子节点发生变化,并且发生的路径为/locks,则判断的所需事件
					if(event.getType()==EventType.NodeChildrenChanged && event.getPath().equals(parent)){	
						//dosometing
						System.out.println(" get event");
						getlock();						
					}
				} catch (Exception e) {				
				}
			}
		});
		currentlock = zk.create(parent+child, "lock".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
//		Thread.sleep(new Random().nextInt(1000));
		List<String> sonlocks = zk.getChildren(parent, true);
//		if(sonlocks.size() == 1){
//			clientwork();
//			currentlock = zk.create(parent+child, "lock".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
//			
//		}
	}
	
	/**
	 * 获取所有锁,排序并判断是不是最小锁
	 * @throws Exception
	 */
	public void getlock() throws Exception{
		//获取所有的子节点的信息,并监听父节点
		List<String> locks = zk.getChildren(parent, true);	
		Collections.sort(locks);
		System.out.println(locks.size() + "  v  " );//+ lockpath
		String cutlock = currentlock.substring((parent+ "/").length());	
		if(locks.get(0).equals(cutlock)){ 	
			 
			 System.out.println(currentlock + " get lock -----");
			//dosomething
			 clientwork();
			//注册一个临时序列节点作为锁
		    currentlock = zk.create(parent+child, "lock".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
			
		}else{
			
			System.out.println( currentlock + " not get lock ****");
		}
			
	}	
	/**
	 * 
	 *处理业务逻辑,或者访问共享资源,然后删除自己的锁
	 * @throws Exception
	 */
	public  void clientwork() throws Exception {
		System.out.println("client starts working .....");
		Thread.sleep(1000);
		zk.delete(currentlock, -1);
		
	}
	/**
	 * 逻辑思路
	 * 1.程序节点启动时到ZK上注册一个临时序列节点,并监听父节点
	 * 2.获取父节点下的所有子节点,比较序号大小
	 * 3.序号最小的获得锁,去访问共享资源,访问完后删除这个节点,相当于释放锁,并重新注册一个节点
	 * 4.其他程序节点会收到事件通知,然后到zk上获取锁
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		
		//创建zk链接并监听父节点
		ShareLock zc= new ShareLock();
		zc.getconnect();
		//先判断着个父目录是否存在,不存在就创建
		//zc.testparent();
		//获取共享锁,并监控父节点
		//zc.getlock();
		
		//zc.clientwork();
		Thread.sleep(Long.MAX_VALUE);
	}
}
STM32F407标准库下ADC多通道DMA采集的配置与优化 本文详细介绍了STM32F407标准库下ADC多通道DMA采集的配置与优化方法。通过GPIO模拟输入配置、ADC时钟和模式设置、DMA传输参数配置等关键步骤,实现高效的多通道数据采集。文章还提供了性能优化技巧和常见问题排查指南,帮助开发者提升采样速率和稳定性。 阅读详情

相关推荐

Intel Mobileye EyeQ Ultra:RISC-V架构的L4自动驾驶芯片解析

RISC-V作为开源指令集架构,凭借其模块化设计和可定制特性,正在重塑高性能计算领域。其精简指令集带来的确定性执行时序,特别适合自动驾驶等实时性要求严苛的场景。在异构计算架构中,RISC-V与专用加速器(如NPU、GPU)的协同设计,能显著提升能效比和算力密度。Mobileye EyeQ Ultra采用12核RISC-V集群,结合176TOPS AI加速器和5nm工艺,实现了L4级自动驾驶所需的实时感知与决策能力。这种架构为车载计算平台提供了可扩展的解决方案,同时降低了系统复杂度和BOM成本。

weixin_33245447的博客 428

详解分布式锁

详解分布式锁

2301_80926085的博客 2873

从病毒分析到安全研究:手把手教你用OD破解加壳程序的反调试机制

本文深入探讨了如何识别并绕过加壳程序的反调试机制,特别是针对使用IsDebuggerPresent等API检测的防护手段。通过实战案例和工具链配置,详细介绍了逆向工程中的关键技巧,包括内存补丁、硬件断点定位OEP等,帮助安全研究人员有效突破软件保护技术。

tgb345678的博客 825

分布式锁Redisson详解(重点)

一、为什么需要分布式锁? 在单体web应用的时候,如果多个线程要访问共享资源的时候,我们通常线程间加锁的机制,在某一个时刻,只有一个线程可以对这个资源进行操作,其他线程需要等待锁的释放,Java中也有一些处理锁的机制,比如synchronized。 而到了分布式的环境中,当某个资源可以被多个系统访问使用到的时候,为了保证大家访问这个数据是一致性的,那么就要求再同一个时刻,只能被一个系统使用,这时候线程之间的锁机制就无法起到作用了,因为分布式环境中,系统是会部署到不同的机器上面的,那么就需要【

Java后端技术栈 8407

antv x6 沿边图标循环动画实现

2.使用transition给边设置动画,利用complte方法实现循环动画。实现效果,如下图,边上存在两个图标,要求图标延边一直循环动画。1.注册一个自定义边,边上定义两个图标,并设置其初始位置。

lingliu0824的博客 3366

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片中。

视觉与物联智能 944

分布式锁解决方案

锁: 单进程的系统中,存在多线程同时操作一个公共变量,此时需要加锁对变量进行同步操作,保证多线程的操作线性执行消除并发修改。解决的是单进程中的多线程并发问题。 分布式锁: 只要的应用场景是在集群模式的多个相同服务,可能会部署在不同机器上,解决进程间安全问题,防止多进程同时操作一个变量或者数据库。解决的是多进程的并发问题。 JVM有锁的感念(局限于同一台java虚拟机...

qq_25432245的博客 682

基于高德地图的单车路径规划与绘制实战(Vue3 + TypeScript)【拓展:货车路径规划函数、限行检测、城市 Adcode】

✅ 支持单辆车路径规划✅ 自动绘制路线✅ 起点、终点、途经点标注✅ 自动缩放视野至全路径✅ 获取路线距离、时长、过路费✅ 提供清除功能✅ 路线信息保存至本文完整实现了一个基于高德地图 JS SDK + Vue3 + TypeScript的👉单车路径规划与绘制模块。核心亮点:清晰的结构;灵活的扩展性;实时路线信息记录(🚀 你可以很方便地将本模块集成到车联网、调度监控、地图展示类项目中。❤️ 如果这篇文章对你有帮助,别忘了:评论区交流 💬。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 1265

分布式共享锁

11.1 需求描述 在我们自己的分布式业务系统中,可能会存在某种资源,需要被整个系统的各台服务器共享访问,但是只允许一台服务器同时访问 11.2 设计思路 11.3 代码开发 public class DistributedClientMy { // 超时时间 ...

weixin_34184158的博客 174

YOLOv11改进策略【Neck】| SEAM:分离和增强注意模块,解决复杂场景下的小目标遮挡问题

本文记录的是利用 SEAM 模块优化 YOLOv11 的目标检测网络模型。的设计出发点在于解决复杂场景下的人脸遮挡问题,相当于是小目标被其他物体部分遮挡时,传统方法因特征缺失导致检测精度下降的问题。该模块通过增强未遮挡区域的特征响应并补偿被遮挡区域的信息损失,提升模型对遮挡小目标的检测能力。YOLO-FaceV2: A Scale and Occlusion Aware Face DetectorSEAM模块(Separated and Enhancement Attention Module)的设计出发点

Limiiiing的博客 2281

【AlphaFold2】深入浅出,讲解Evoformer|学习笔记

本篇博客是围绕youtube德国博主Kilian Mandon()的《从头实现AlphaFold2:AlphaFold Decoded》的第五期视频讲解和note-book内容写成的笔记,加上了自己的理解和对相关概念的解释。上期我们讲解了AlphaFold2的特征提前的部分【AlphaFold2】Feature extraction:提取特征,为模型输入做准备|Datapipeline讲解。本期,我们将介绍AlphaFold2中最为庞大且最为重要的部分——Evoformer。

Yaoyao2024的博客 2016

什么是分布式锁?几种分布式锁分别是怎么实现的?

一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。 2、分布式锁应该具备哪些条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 高性能的获取锁与释放锁 具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误) ...

m0_67645544的博客 6万+

ADS基础教程12 - 参数扫描

在硬件设计、仿真以及调试阶段,很多时候需要找到一个合理的参数来使设计处于最优状态。前面所讲的调优方式是其中的最直接的手段。因此,本文将介绍ADS中如何指定元器件的参数为变量,并可以对变量设置相应的约束条件,来实现的变量进行多组参数的仿真结果的展示。在图形显示界面,添加一个Plot,并添加参数结果。此时,结果中会显示出所有的扫描结果。参数扫描的要素包含:新建变量、变量参数设置、扫描模型设置三个方面。如果找不到该图标,在菜单栏单击右键,弹出的对话框将。,弹出的选项卡中,将添加两个变量。点击菜单栏的仿真按钮。

XZ_ZC的博客 8162

Zookeeper的简单运用 -- 基于ZK的分布式共享锁、应用系统服务器上下线动态感知

Zookeeper的简单运用 1. ZooKeeper Java API org.apache.zookeeper.Zookeeper: Zookeeper 是在 Java 中客户端主类,负责建立与 zookeeper 集群的会话, 并提供方法进行操作。 org.apache.zookeeper.Watcher Watcher 接口表示一个标准的事件处理器,其定义了事件通知相关的逻辑, 包...

JeremyIverson的博客 425

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ZooKeeper 常用操作API详解

转载:http://www.aboutyun.com/thread-12817-1-1.html 问题导读: 1、ZooKeeper的常用API方法都有那些? 2、Zookeeper 到底能帮我们解决那些问题? 3、如何实现共享锁(Locks)?   ZooKeeper是一个用于分布式应用程序的分布式开源协调服务。它使用一组简单的操作原语,使得分布式应用可以实现更高层

haihongazar的博客 4949

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

分布式基础:Curator实现Zookeeper分布式锁

官网的说法curator是一个Java/JVM客户端库,用于zookeeper,一个分布式协调服务。它包括一个高级API框架和实用程序,使ApacheZooKeeper的使用更加简单和可靠。它还包括常见用例和扩展的方法,如服务发现和Java8异步DSL。Curator使用手册-腾讯云开发者社区-腾讯云配置zookeeper集群参考;https。...........................

ReturnTmp的博客 2976

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ZooKeeper之Java API的基本使用以及应用场景的实现

介绍ZooKeeper中Java API的基本使用,以及对Zookeeper常见应用场景的具体实现。

积跬步,至千里。 1058

分布式框架(三):Zookeeper 整合实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有: ZooKeeper官方的Java客户端API 第三方的Java客户端API,比如Curator ZooKeeper官方的客户端 ZooKeeper官方的客户端API提供了基本的操作。例如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。 不过,对于实际开发来说,ZooKeeper官方API有一些不足之处,具体如下: ZooKeeper的Watcher监测

Men-DD 1251

干货|排他锁和共享锁分别是什么?有什么不同?

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干...

传智播客的专栏 1万+

HoRain云--Zookeeper 分布式锁实现原理

【摘要】本文介绍了Zookeeper实现分布式锁的两种方式:排他锁(独占锁)和共享锁(读锁)。排他锁通过创建唯一临时节点实现独占访问,共享锁则通过临时顺序节点和读写判断机制实现并发读控制。文章详细阐述了两种锁的实现原理,并提供了基于Curator工具包的Java代码示例(包含InterProcessMutex实现的可重入排他锁演示)。最后推荐了Curator提供的三种分布式锁方案,帮助开发者在分布式系统中实现资源同步访问控制。全文包含技术原理、实现细节和实战代码,适合分布式系统开发者参考。(149字)

2401_86544677的博客 844

Zookeeper封装的客户端jar包 api简单演示

前面几篇演示了zookeeper的原生api,由于原生api在实现某些功能上比较繁琐,开发人员需要关注很多实现细节,因此业界出现了对zookeeper原生api的一些封装工具包。本篇简单介绍比较流行的两个开源客户端。 ZkClient <dependency> <groupId>com.101tec</groupId> <art...

程序男的专栏 524

ZooKeeper的应用--分布式共享锁

(一)需求描述 在我们自己的分布式业务系统中,可能会存在某种资源,需要被整个系统的各台服务器共享访问,但是只允许一台服务器同时访问 (二)设计思路 1、设计多个客户端同时访问同一个数据 2、为了同一时间只能允许一个客户端上去访问,所以各个客户端去 zookeeper 集群的一个znode 节点去注册一个临时节点,定下规则,每次都是编号最小的客户端才能去访问 3、多个客户端同时监听该节点,每次当有子...

lv_hulk的博客 261

zookeeper集群搭建及使用

zookeeper集群搭建及使用

大数据同盟会的博客 9669

实现Zookeeper分布式锁*(排他锁和共享锁)

1.分布式锁 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。 如果不同的系统或同一个系统下不同的主机访问同一个或者一组资源。那么访问这些资源的时候,往往需要一些通过一些互斥的手段来防止彼此之间的干扰,以保证一致性,这种时候就需要分布式锁了。 2.排他锁(概念) 排他锁(ExculusiveLocks) 又称为写锁或独占锁。是一种锁类型,如果事务T1对数据对象O加上了排他锁。 那么在整个加锁期间,只有事务T1可以对数据对象O进行读写操作,其它任何事务都不能对数据对象O进行任何类型的操作。 直到T1

FDXCG_X的博客 977

Curator+Zookeeper实现分布式锁的示例

随着互联网的兴起,应用的单服务器部署已无法满足日益增长的用户需求,此时云服务+分布式技术应用而生,解决了应用弹性伸缩的问题。问题来了,分布式不同于单机,在单机应用下可以使用Java的并发编程API实现对共享资源的控制,而在分布式应用系统环境则可以借助Zookeeper来实现,Apache的顶级开源项目Curator则是为了更加方便操作Zookeeper而产生的Java项目。本文基于Curator+Zookeeper实现各种分布式锁,以实现分布式环境下对有限共享资源的并发访问。

潜心学习+快乐编程+事业=人生 1487

Zookeeper 分布式锁实现原理

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。下面介绍 zookeeper 如何实现分布式锁,讲解排他锁和共享锁两类分布式锁。

1037
上一篇: zookeeper的API简单编程二---服务器上下线的实时通知处理
下一篇: 集成VIM强大的代码编辑器三---我的vim配置
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值