####排它锁
+ 在需要获取排它锁时,通过调用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实践的更多相关文章

  1. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  2. 1、ZooKeeper 基本概念、使用方法、实践场景

    ZooKeeper 基本概念 ZooKeeper 是面向分布式应用的协调服务,其实现了树形结构的数据模型(与文件系统类似),并且提供了简洁的编程原语.ZooKeeper 能够作为基础,用于构建更高层级 ...

  3. 分布式锁实践(二)-ZooKeeper实现总结

    写在最前面 前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程.其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布 ...

  4. 我读《从Paxos到zookeeper分布式一致性原理与实践》

    从年后拿到这本书开始阅读,到准备系统分析师考试之前,终于读完了一遍,对Zookeeper有了一个全面的认识,整本书从理论到应用再到细节的阐述,内容安排从逻辑性和实用性上都是很优秀的,对全面认识Zook ...

  5. 4、Dubbo-工程实践

    4.实践测试 4.1).提出需求 某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址: 我们现在 需要创建两个服务模块进行测试  测试预期结果: 订单服务web模块在A服务器,用户服务模块在 ...

  6. ZooKeeper分布式锁简单实践

    ZooKeeper分布式锁简单实践 在分布式解决方案中,Zookeeper是一个分布式协调工具.当多个JVM客户端,同时在ZooKeeper上创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁 ...

  7. 实践部署与使用apache kafka框架技术博文资料汇总

    前一篇Kafka框架设计来自英文原文(Kafka Architecture Design)的翻译及整理文章,非常有借鉴性,本文是从一个企业使用Kafka框架的角度来记录及整理的Kafka框架的技术资料 ...

  8. 《zookeeper原理与实践》笔记

    第1章 分布式架构 1.1 分布式 分布式特点:分布性.对等性.并发性.缺乏全局时钟.故障总是会发生. 分布式问题:通讯异常.网络分区(脑裂).三态.节点故障.   1.2 ACID到CAP/BASE ...

  9. webp图片实践之路

    最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...

随机推荐

  1. Grass is Green

    Root    3719 - Grass is Green Time limit: 3.000 seconds This year exactly n <tex2html_verbatim_ma ...

  2. each()和eq()

    今天工作的时候要遍历一个表格,于是我就想到了each(),也没看文档就开始写,大概是这么写的 $(".class").each(function(){ this.click(fun ...

  3. HTTP/2.0 简单总结(转载)

    HTTP/2.0 简单总结(转载于https://linjunzhu.github.io/blog/2016/03/10/http2-zongjie/) 如何使用上 HTTP/2.0 需要浏览器的支持 ...

  4. 微信小程序导航设置

    "tabBar": { "backgroundColor": "#ffffff", "color": "#00 ...

  5. python中赋值、浅拷贝、深拷贝详解(转)

    一.赋值 >>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')139701469 ...

  6. python简单爬虫一

    简单的说,爬虫的意思就是根据url访问请求,然后对返回的数据进行提取,获取对自己有用的信息.然后我们可以将这些有用的信息保存到数据库或者保存到文件中.如果我们手工一个一个访问提取非常慢,所以我们需要编 ...

  7. Deep Learning基础--随时间反向传播 (BackPropagation Through Time,BPTT)推导

    1. 随时间反向传播BPTT(BackPropagation Through Time, BPTT) RNN(循环神经网络)是一种具有长时记忆能力的神经网络模型,被广泛用于序列标注问题.一个典型的RN ...

  8. 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  9. PHP的instanceof关键字

    PHP5的另一个新成员是instdnceof关键字.使用这个关键字可以确定一个对象是类的实例.类的子类,还是实现了某个特定接口,并进行相应的操作.在某些情况下,我们希望确定某个类是否特定的类型,或者是 ...

  10. Python抓取微博评论

    本人是张杰的小迷妹,所以用杰哥的微博为例,之前一直看的是网页版,然后在知乎上看了一个抓取沈梦辰的微博评论的帖子,然后得到了这样的网址 然后就用m.weibo.cn进行网站的爬取,里面的微博和每一条微博 ...