`
落叶换新叶
  • 浏览: 25278 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

ZooKeeper实现分布式事物锁

阅读更多

闲暇时研究了下基于ZooKeeper实现的分布式事务锁,做下记录,便于回顾复习

public class DistributeLock implements Lock,Watcher {

	//锁的名称
	private String lockName;
	private long TIMEOUT = 3000;
	//当前锁的节点
	private String currentLockNode;
	//前一个锁的节点
	private String prevLockNode;
	private ZooKeeper zk;
	private int SESSION_TIME_OUT = 2000;
	private String ROOT_LOCK = "/locks";
	private String PATH_PREFIX = "_locks";
	//计数器-也为锁的触发器
	private CountDownLatch countDownLatch;
	
	public DistributeLock(String ip,String lockName) {
		this.lockName = lockName;
		try {
			zk = new ZooKeeper(ip, SESSION_TIME_OUT, this);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void process(WatchedEvent event) {
		if(countDownLatch!=null) {
			countDownLatch.countDown();
		}
	}

	@Override
	public void lock() {
		if(tryLock()) {
			return ;
		}else {
			waitForLock(TIMEOUT);
		}
	}
	
	public boolean waitForLock(long timeOut) {
		Stat stat;
		try {
			stat = zk.exists(prevLockNode, true);
			if(stat!=null) {
				countDownLatch = new CountDownLatch(1);
				//设置超时时间    (不清楚会不会出现异常情况)
				countDownLatch.await(TIMEOUT,TimeUnit.MILLISECONDS);
				countDownLatch = null;
			}
			return true;
		} catch (KeeperException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public void lockInterruptibly() throws InterruptedException {
		if(zk!=null) {			
			zk.close();
		}
		
	}

	@Override
	public Condition newCondition() {
		return null;
	}

	@Override
	public boolean tryLock() {
		try {
			Stat stat = zk.exists(ROOT_LOCK, false);
			//没有根节点
			if(stat==null) {
				zk.create(ROOT_LOCK, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
			}
			if(lockName.contains(PATH_PREFIX)) {
				System.out.println("锁名称错误");
				return false;
			}
			String nodePath = zk.create(ROOT_LOCK+"/"+lockName+"/"+PATH_PREFIX, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
			//获取根目录下的子节点
			List<String> childList = zk.getChildren(ROOT_LOCK, false);
			List<String> lockPathList = new ArrayList<String>();
			for(String childNode:childList) {
				String splitePath = childNode.split("/"+PATH_PREFIX)[0];
				if(splitePath.equals(ROOT_LOCK+"/"+lockName)) {
					lockPathList.add(childNode);
				}
			}
			Collections.sort(lockPathList);
			//当前节点为最小节点
			if(nodePath.equals(lockPathList.get(0))) {
				currentLockNode = nodePath;
				return true;
			}
			//前一个节点
			prevLockNode = lockPathList.get(lockPathList.indexOf(lockPathList)-1);
			return false;
		} catch (KeeperException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public boolean tryLock(long timeOut, TimeUnit timeUnit)
			throws InterruptedException {
		if(tryLock()) {
			return true;
		}
		return waitForLock(timeOut);
		
	}

	@Override
	public void unlock() {
		try {
			if(zk!=null) {
				zk.delete(currentLockNode, -1);
				zk.close();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (KeeperException e) {
			e.printStackTrace();
		}
	}
}

 

0
0
分享到:
评论

相关推荐

    Java面试题包涵基础,微服务分布式,数据库,jvm,网络,设计模式,算法,分布式锁和分布式事物等等

    分布式锁用于保证多节点间的同步,如Redis或Zookeeper实现的分布式锁。分布式事务处理则涉及到2PC、TCC、Saga等多种模型,确保在分布式环境下的数据一致性。 以上各点是Java开发者面试时常见的重点,对于每个知识点...

    zookeepers分布式

    它主要用于解决分布式环境中的命名、配置管理、同步服务以及分布式事物等问题,为分布式应用提供一致性服务。本文将深入探讨ZooKeeper的核心概念、设计原则以及在实际应用中的作用。 一、ZooKeeper的核心概念 1. *...

    分布式事物案例demo用到的数据库与数据表

    因此,一些系统选择使用乐观锁或悲观锁策略,或者采用分布式事务协调器如Zookeeper、Kafka等来优化性能和容错性。 总之,分布式事务是确保分布式系统数据一致性的核心机制。通过理解各种分布式事务模型和技术,结合...

    zookeeperDesign::star::star::star:zk的设计与使用(集群,dubbo,分布式锁,master选举,负载均衡,watch,权限等)

    邮箱 : Github : QQ : QQ群 : 本项目介绍 : ! zookeeper 的基础命令?... zookeeper分布式锁? ! zookeeperZAP协议源码分析? ! zookeeper的启动流程分析? ! zookeeper快照与事物日志的存储结构? - 如果你不知道那还不赶

    PyPI 官网下载 | hyperscas-1.1.25.tar.gz

    Apache ZooKeeper是分布式系统的基石,它提供了一种集中式的服务,用于命名、配置管理、群组服务、同步和分布式事物。ZooKeeper的设计目标是简单、高效,可以处理大量并发请求,同时保证强一致性。在分布式环境中,...

    分布式事务.png

    分布式事务设计:分布式基础理论(TCC,BASE,2PS等),以及利用zookeeper作为控制中心设计分布式事物。

    Zookeeper篇.pdf

    1.9 zk 的分布式锁 2.0 zk 队列管理 2.1 zk 数据复制 2.2 zk 的工作原理 2.3 zk 是如何保证事物的顺序一致性 2.4 zk 集群下 server 工作状态 2.5 zk 是如何选举 Leader 的? 2.6 zk 同步流程 2.7 分布式通知和协调 ...

    zookeeper-3.36

    5. 分布式事物服务:提供原子性的操作,如创建、删除、更新节点等。 三、Zookeeper的架构 1. 集群模式:由多个Server组成,分为Leader和Follower两类角色。Leader负责处理所有的写请求,Follower处理读请求,同时...

    zookeeper简介(1)共3页.pdf.zip

    7. **分布式事物服务**:提供简单的分布式事务支持,如顺序操作等。 Zookeeper的架构基于Paxos算法的变种,确保了数据的一致性和可靠性。它采用了主从结构,由一个或多个服务器节点(称为Zookeeper服务器)组成,...

    apache-zookeeper-3.6.3-bin.rar

    - 分布式事物处理 总的来说,"apache-zookeeper-3.6.3-bin.rar"这个压缩包是Zookeeper的二进制安装包,包含了部署和使用Zookeeper所需的所有文件。通过对Zookeeper的理解和实践,可以有效地解决分布式环境下的诸多...

    zk开发工具

    - **分布式事物**:提供简单的分布式事物支持。 ### 4. 使用Zookeeper进行本地开发 **步骤1:安装Zookeeper** 下载并解压`zookeeper-3.4.8`压缩包,配置环境变量,包括`ZOOKEEPER_HOME`和`PATH`,确保可以执行`zk...

    PyPI 官网下载 | resolwe-21.0.0a2.tar.gz

    1. **Zookeeper**:Apache ZooKeeper是一个分布式的,开放源码的协调服务,用于管理应用程序配置信息,命名服务,集群同步,分布式事物等。这表明`resolwe`可能在分布式环境中使用Zookeeper来实现组件间的协调和一致...

    ZooKeeper 28 道面试题及答案.docx

    ZooKeeper Watcher 机制允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能。Watcher 特性总结:一次...

    Springboot-dubbo-fescar 阿里分布式事务的实现方法

    在分布式系统中,确保事务的一致性是一项挑战。SpringBoot、Dubbo 和 Fescar(原 Alipay Seata)的组合提供了一种解决...通过理解这些组件的原理和工作流程,可以更好地实现和维护大规模分布式系统的稳定性和可靠性。

    Zookeeper面试题 20道.pdf

    分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。 Zookeeper保证了如下分布式一致性特性: * 顺序一致性 * ...

    分布式集群技术.pdf

    分布式协调框架 ZooKeeper 是分布式集群技术的基础,ZooKeeper 基本概念和体系结构、ZooKeeper 集群的安装、操作 ZooKeeper、ZooKeeper 编程 API 等内容将为读者提供了分布式协调框架 ZooKeeper 的基础知识。...

    商品秒杀系统(限时抢购系统)

    zookeeper分布式锁 自定义注解 统一封装返回 切面使用 设计模式使用 事物、回滚使用 docker、nginx使用 图片服务器OSS使用 stram、lambda使用 多线程、线程池使用 定时任务使用 短信验证、邮件服务使用 JWT验证TOKEN...

    PyPI 官网下载 | opthedgehog-0.3.7.tar.gz

    这可能意味着`opthedgehog`在分布式环境下运行,依赖ZooKeeper来实现高可用性和数据一致性。 "分布式"标签进一步证实了`opthedgehog`在处理分布式系统中的问题。分布式计算已经成为现代软件架构的核心,尤其是在...

    蚂蚁课堂(每特学院)第一期-Java高端培训视频教程

    MySQL优化之索引实现原理.zip ├─0030--MySQL优化之SQL语句调优.zip ├─0031--MySQL优化之分表分库与读写分离.zip ├─0032--Java培优结业典礼第一天(面试题回顾).zip ├─0033--Java培训就业典礼第二天(分布式...

Global site tag (gtag.js) - Google Analytics