先复习一下ZK实现分布式锁的原理:

每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。 判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。 当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。

通过代码验证是否生成了瞬时的有序节点

package com.jv.zookeeper.curator;

import java.util.concurrent.TimeUnit;

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.recipes.locks.InterProcessMutex;

import org.apache.curator.retry.ExponentialBackoffRetry;

public class TestInterProcessMutex {

public static void main(String[] args) throws Exception {

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.245.101:2181", retryPolicy);

client.start();

InterProcessMutex lock = new InterProcessMutex(client, "/mylock");

//lock.acquire(1000, TimeUnit.MILLISECONDS) 获取锁,超时时间为1000毫秒

if ( lock.acquire(1000, TimeUnit.MILLISECONDS) )

{

try

{

System.out.println("得到锁,并执行");

//模拟线程需要执行很长时间,观察ZK中/mylock下的临时ZNODE情况

Thread.sleep(10000000);

}

finally

{

lock.release();

System.out.println("释放锁");

}

}

}

}

package com.jv.zookeeper.curator;

import java.util.concurrent.TimeUnit;

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.recipes.locks.InterProcessMutex;

import org.apache.curator.retry.ExponentialBackoffRetry;

public class TestInterProcessMutex2 {

public static void main(String[] args) throws Exception {

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.245.101:2181", retryPolicy);

client.start();

InterProcessMutex lock = new InterProcessMutex(client, "/mylock");

//将超时时间设置足够长,观察ZK中ZNODE的情况,以验证分布式锁的原理是否是使用建立临时顺序ZNODE实现的

if ( lock.acquire(1000000, TimeUnit.MILLISECONDS) )

{

try

{

System.out.println("得到锁,并执行");

Thread.sleep(10000000);

}

finally

{

lock.release();

System.out.println("释放锁");

}

}

}

}

要把代码跑起来,在pom.xml中加入如下依赖

org.apache.zookeeper

zookeeper

3.4.6

org.apache.curator

curator-recipes

4.0.0

先运行TestInterProcessMutex,在运行TestInterProcessMutex2

使用xshell或者securityCRT登录zookeeper主机

进入到zookeeper的安装目录/bin

./zkCli.sh

ls /mylock

可以看到确实生成了两个瞬时有序节点,并且序号小的客户端获得了锁

curator封装过后使用确实很方便

补充一点,curator还可以很方便的实现选举

LeaderSelectorListener listener = new LeaderSelectorListenerAdapter()

{

public void takeLeadership(CuratorFramework client) throws Exception

{

// 这是你变成leader时执行的方法,你可以在这里执行leader的所有操作

// 如果你想放弃leader,你必须退出此方法

}

}

LeaderSelector selector = new LeaderSelector(client, path, listener);

selector.autoRequeue(); // not required, but this is behavior that you will probably expect

selector.start();

它的原理就是包装了InterProcessMutex,然后LeaderSelector跑起来之后就去获取锁,一旦获取到锁就调用listener.takeLeadership方法

这种选举还是有点太简单了,没有去考虑资源、数据问题。zk本身的选举就需要考虑参考事务ID的大小,拥有最大事务ID的服务器才能是leader,然后follower同步leader中比自己更大的事务,达到数据一致

实际应用的话,需要考虑分布式组件的情况,选择是否使用ZK提供的简单选举策略

php zookeeper分布式事务,ZK实现分布式事务锁代码及原理验证相关推荐

  1. Apache ZooKeeper - 使用ZK实现分布式锁(非公平锁/公平锁/共享锁 )

    文章目录 什么是分布式锁 分布式死锁 分类 排他锁 共享锁 实现 创建锁 获取锁 释放锁 Demo Jmeter配置 方案零 缺陷版本 方案一 非公平锁方案 缺陷 (羊群效应) 方案二 公平锁方案 方 ...

  2. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  3. Redis应用学习——Redis事务与实现分布式锁

    2019独角兽企业重金招聘Python工程师标准>>> 1. Redis事务机制 1. 与MySQL等关系数据库相同,Redis中也有事务机制,Redis的事务实质上是命令的集合,但 ...

  4. 分布式事务_实施分布式锁概述

    分布式事务 众所周知,锁通常用于监视和控制多个线程同时访问共享资源. 它们基本上保护并发应用程序中的数据完整性和原子性,即,一次只能有一个线程可以获取共享资源上的锁,否则将无法访问该锁. 但是在分布式 ...

  5. 开发者说:深度剖析开源分布式事务方案 Seata 的事务协调器

    开源共建,不仅体现在共同贡献代码,也包括开发者们根据自己的实践,通过文字的方式,向外表达自己的观点.收获.踩过的坑以及相应的解决方案. 本期开始,我们将推出「开发者说」的专栏,发布来自社区开发者自己写 ...

  6. 【分布式系列】分布式事务:TX-LCN分布式事务框架整合实践

    热门系列: [分布式系列]分布式锁原理篇-Redisson.Zookeeper.Database 程序人生,精彩抢先看 目录 1.前序 2.过程 2.1 TX-LCN框架介绍 2.2 环境搭建 2.2 ...

  7. springcloud分布式事务解决方案_搞懂分布式技术18:分布式事务常用解决方案

    本文转载自 http://linkedkeeper.com 本文内容参考网络,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...

  8. Redis事务机制和分布式锁

    Redis事务机制 严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的:Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行. ...

  9. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

最新文章

  1. 提升Hadoop计算能力的并行框架
  2. 昨天又帮爸DIY了一台工作电脑
  3. 0x80070003系统找不到指定路径_Win7系统中gpedit.msc找不到应该如何解决?
  4. 威纶和s7200通讯线_威纶触摸屏与s7-200通信实例
  5. 2017.5.11 道路修建 思考记录
  6. 选择多级分类_② 供应商管理(分类、评估、选择、绩效、集成、供应商过多的对策、多级供应商管理)...
  7. STM32F103--DHT11的配置
  8. Nginx性能优化功能- Gzip压缩(大幅度提高页面加载速度)
  9. freebsd php mysql_在freebsd和linux下安装mysql+php+apache2
  10. mockito 静态方法_Mockito模拟静态方法– PowerMock
  11. Centos6.5安装FastDFS
  12. openssl 加密解密
  13. 苹果电脑mac系统空间不足怎么清理内存优化?最详细的教程分享
  14. 视频教程-备战2020毕业季—毕业设计论文实战课程讲解-.NET
  15. 可对接WMS|ERP跨境电商的分拣线 仓储物流智能快递直线分拣机
  16. 507「LibreOJ NOI Round #1」接竹竿-DP
  17. 系统分析员、系统架构师、项目经理的区别
  18. C#WinForm程序 窗口不在任务栏显示的处理方法
  19. More than just chatter
  20. web安全基础知识-part2

热门文章

  1. 拖拉机java_拖拉机(升级)必胜之秘诀 - 淡泊明志,宁静致远 - JavaEye技术网站...
  2. 概率论__EXCEL查值
  3. java getfield_Field getField(String name)
  4. mysql求班级男女比例_男女比例失调的班级是什么样的?
  5. Python GUI之PyQT QTCreater专讲
  6. Faceu完成B轮融资 未来产品将定位短视频聊天
  7. linux下看libc源码,获得libc的调试信息
  8. 2021-08-30 SONiC中相干光模块的管理
  9. 单元测试框架PowerMock
  10. docker-compose搭建rap2