zookpeer应用和zkclient实践
####排它锁
+ 在需要获取排它锁时,通过调用create()接口,创建临时子节点。zk会保证在所有客户端中,只有一个会创建成功,从而获取锁。
+ 其他客户端注册该节点的变更watch监听,在锁释放后重新竞争
+ 获取锁的客户端宕机或者完成后,临时节点删除释放锁
共享锁(读锁)
也是创建临时顺序节点,可以被多个事务持有,根据节点序号确定读写锁的执行顺序(原理是减小锁的范围)
分布式队列(FIFO)
- 类似创建多个共享读锁,根据创建的临时节点的序号
- 通过getChindren获取所有子节点,获取队列中的所有元素
- 如果自己不是序号最小的节点则等待,同时向序号比自己小的最后一个节点注册watcher监听
zk和kafka
- kafka主题topic,用于建立生产者和消费者之间的订阅关系,生产者发送消息到指定topic下,消费者从这个topic消费(可以按照业务区分)
- 消息分区partitin,类似3个节点6个分区,(00,01;11,12;21,22)
- broker是kafka的服务器,用于存储消息
- 消费者分组group,拥有同一个分组名称,也被称为消费者集群
####加载依赖
```bash
com.github.adyliu
zkclient
2.0
```
####java示例代码
```java
import com.github.zkclient.IZkChildListener;
import com.github.zkclient.IZkDataListener;
import org.springframework.stereotype.Controller;
import com.github.zkclient.ZkClient;
import java.util.List;
@Controller
public class ZkClientController {
public static void main(String[] args) throws Exception {
ZkClient zkClient = new ZkClient("172.16.67.131:2181,172.16.67.131:2182,172.16.67.131:2183");
System.out.println("ZkClient connect begin");
String basePath = "/zk-test";
//递归创建节点,永久节点
String newPath = "/zk-test/c1";
zkClient.createPersistent(newPath, true);
//获取子节点
List<String> list = zkClient.getChildren(basePath);
System.out.println("count: " + zkClient.countChildren(basePath));
for (String item : list) {
System.out.println(item);
}
//子节点变更订阅
zkClient.subscribeChildChanges(basePath, new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChildren) throws Exception {
System.out.println(parentPath + " changed,child: " + currentChildren);
}
});
System.out.println(zkClient.getChildren(basePath));
Thread.sleep(1000);
if(!zkClient.exists(basePath+"/c2")){
zkClient.createPersistent(basePath + "/c2");
Thread.sleep(1000);
}
zkClient.delete(basePath + "/c2");
Thread.sleep(1000);
//节点内容变更订阅,创建临时节点
zkClient.createEphemeral(basePath + "/c3", "123".getBytes());
zkClient.subscribeDataChanges(basePath + "/c3", new IZkDataListener() {
@Override
public void handleDataChange(String dataPath, byte[] data) throws Exception {
System.out.println("node " + dataPath + " change to " + new String(data));
}
@Override
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("node " + dataPath + " deleted");
}
});
System.out.println(new String(zkClient.readData(basePath + "/c3")));
zkClient.writeData(basePath+"/c3","456".getBytes());
Thread.sleep(1000);
zkClient.delete(basePath+"/c3");
Thread.sleep(1000);
}
}
####输出结果
```bash
ZkClient connect begin
count: 1
c1
[c1]
/zk-test changed,child: [c1, c2]
/zk-test changed,child: [c1]
/zk-test changed,child: [c3, c1]
123
node /zk-test/c3 change to 456
node /zk-test/c3 deleted
/zk-test changed,child: [c1]
zookpeer应用和zkclient实践的更多相关文章
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- 1、ZooKeeper 基本概念、使用方法、实践场景
ZooKeeper 基本概念 ZooKeeper 是面向分布式应用的协调服务,其实现了树形结构的数据模型(与文件系统类似),并且提供了简洁的编程原语.ZooKeeper 能够作为基础,用于构建更高层级 ...
- 分布式锁实践(二)-ZooKeeper实现总结
写在最前面 前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程.其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布 ...
- 我读《从Paxos到zookeeper分布式一致性原理与实践》
从年后拿到这本书开始阅读,到准备系统分析师考试之前,终于读完了一遍,对Zookeeper有了一个全面的认识,整本书从理论到应用再到细节的阐述,内容安排从逻辑性和实用性上都是很优秀的,对全面认识Zook ...
- 4、Dubbo-工程实践
4.实践测试 4.1).提出需求 某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址: 我们现在 需要创建两个服务模块进行测试 测试预期结果: 订单服务web模块在A服务器,用户服务模块在 ...
- ZooKeeper分布式锁简单实践
ZooKeeper分布式锁简单实践 在分布式解决方案中,Zookeeper是一个分布式协调工具.当多个JVM客户端,同时在ZooKeeper上创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁 ...
- 实践部署与使用apache kafka框架技术博文资料汇总
前一篇Kafka框架设计来自英文原文(Kafka Architecture Design)的翻译及整理文章,非常有借鉴性,本文是从一个企业使用Kafka框架的角度来记录及整理的Kafka框架的技术资料 ...
- 《zookeeper原理与实践》笔记
第1章 分布式架构 1.1 分布式 分布式特点:分布性.对等性.并发性.缺乏全局时钟.故障总是会发生. 分布式问题:通讯异常.网络分区(脑裂).三态.节点故障. 1.2 ACID到CAP/BASE ...
- webp图片实践之路
最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...
随机推荐
- turn服务部署
centos7.2 git clone https://github.com/coturn/coturnyum -y install openssl-develyum install openssl ...
- 解决HTML5标签兼容的办法搜集
HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显得非常简单. HTML5的新标签元素有: <header&g ...
- HDU 2827 高斯消元
模板的高斯消元.... /** @Date : 2017-09-26 18:05:03 * @FileName: HDU 2827 高斯消元.cpp * @Platform: Windows * @A ...
- 【BZOJ】3991: [SDOI2015]寻宝游戏 虚树+DFS序+set
[题意]给定n个点的带边权树,对于树上存在的若干特殊点,要求任选一个点开始将所有特殊点走遍后返回.现在初始没有特殊点,m次操作每次增加或减少一个特殊点,求每次操作后的总代价.n,m<=10^5. ...
- 48、面向对象中super的作用?
什么是super? super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序( ...
- pycharm双击无响应,打不开问题解决办法
之前好好的pycharm,突然双击打不开了,怎么办? 亲测有效方案: 第一步:进入如下路径,找到cmd.exe,右键选择“以管理员身份运行”: 第二步:在打开的cmd窗口中,输入 netsh wins ...
- 【转载】在GitHub上管理项目
在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...
- SP 页面缓存以及清除缓存
JSP 页面缓存以及清除缓存 一.概述 缓存的思想可以应用在软件分层的各个层面.它是一种内部机制,对外界而言,是不可感知的. 数据库本身有缓存,持久层也可以缓存.(比如:hibernate,还分1级和 ...
- 产生唯一的临时文件mkstemp()
INUX下建立临时的方法(函数)有很多, mktemp, tmpfile等等. 今天只推荐最安全最好用的一种: mkstemp. mkstemp (建立唯一临时文件)头文件: #include < ...
- LightOJ 1319 Monkey Tradition(中国剩余定理)
题目链接:https://vjudge.net/contest/28079#problem/U 题目大意:给你n(n<12)行,每行有pi,ri,求一个数ans满足ans%pi=ri(i从1~n ...