php zookeeper分布式事务,ZK实现分布式事务锁代码及原理验证
先复习一下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实现分布式事务锁代码及原理验证相关推荐
- Apache ZooKeeper - 使用ZK实现分布式锁(非公平锁/公平锁/共享锁 )
文章目录 什么是分布式锁 分布式死锁 分类 排他锁 共享锁 实现 创建锁 获取锁 释放锁 Demo Jmeter配置 方案零 缺陷版本 方案一 非公平锁方案 缺陷 (羊群效应) 方案二 公平锁方案 方 ...
- 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...
- Redis应用学习——Redis事务与实现分布式锁
2019独角兽企业重金招聘Python工程师标准>>> 1. Redis事务机制 1. 与MySQL等关系数据库相同,Redis中也有事务机制,Redis的事务实质上是命令的集合,但 ...
- 分布式事务_实施分布式锁概述
分布式事务 众所周知,锁通常用于监视和控制多个线程同时访问共享资源. 它们基本上保护并发应用程序中的数据完整性和原子性,即,一次只能有一个线程可以获取共享资源上的锁,否则将无法访问该锁. 但是在分布式 ...
- 开发者说:深度剖析开源分布式事务方案 Seata 的事务协调器
开源共建,不仅体现在共同贡献代码,也包括开发者们根据自己的实践,通过文字的方式,向外表达自己的观点.收获.踩过的坑以及相应的解决方案. 本期开始,我们将推出「开发者说」的专栏,发布来自社区开发者自己写 ...
- 【分布式系列】分布式事务:TX-LCN分布式事务框架整合实践
热门系列: [分布式系列]分布式锁原理篇-Redisson.Zookeeper.Database 程序人生,精彩抢先看 目录 1.前序 2.过程 2.1 TX-LCN框架介绍 2.2 环境搭建 2.2 ...
- springcloud分布式事务解决方案_搞懂分布式技术18:分布式事务常用解决方案
本文转载自 http://linkedkeeper.com 本文内容参考网络,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...
- Redis事务机制和分布式锁
Redis事务机制 严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的:Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行. ...
- WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...
最新文章
- 提升Hadoop计算能力的并行框架
- 昨天又帮爸DIY了一台工作电脑
- 0x80070003系统找不到指定路径_Win7系统中gpedit.msc找不到应该如何解决?
- 威纶和s7200通讯线_威纶触摸屏与s7-200通信实例
- 2017.5.11 道路修建 思考记录
- 选择多级分类_② 供应商管理(分类、评估、选择、绩效、集成、供应商过多的对策、多级供应商管理)...
- STM32F103--DHT11的配置
- Nginx性能优化功能- Gzip压缩(大幅度提高页面加载速度)
- freebsd php mysql_在freebsd和linux下安装mysql+php+apache2
- mockito 静态方法_Mockito模拟静态方法– PowerMock
- Centos6.5安装FastDFS
- openssl 加密解密
- 苹果电脑mac系统空间不足怎么清理内存优化?最详细的教程分享
- 视频教程-备战2020毕业季—毕业设计论文实战课程讲解-.NET
- 可对接WMS|ERP跨境电商的分拣线 仓储物流智能快递直线分拣机
- 507「LibreOJ NOI Round #1」接竹竿-DP
- 系统分析员、系统架构师、项目经理的区别
- C#WinForm程序 窗口不在任务栏显示的处理方法
- More than just chatter
- web安全基础知识-part2
热门文章
- 拖拉机java_拖拉机(升级)必胜之秘诀 - 淡泊明志,宁静致远 - JavaEye技术网站...
- 概率论__EXCEL查值
- java getfield_Field getField(String name)
- mysql求班级男女比例_男女比例失调的班级是什么样的?
- Python GUI之PyQT QTCreater专讲
- Faceu完成B轮融资 未来产品将定位短视频聊天
- linux下看libc源码,获得libc的调试信息
- 2021-08-30 SONiC中相干光模块的管理
- 单元测试框架PowerMock
- docker-compose搭建rap2