####排它锁
+ 在需要获取排它锁时,通过调用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. 在web.xml中添加servlet报错问题

    出现这种问题的原因是因为servlet-name标签中没有名称,如果错误出现在servlet上,也是一样,补充servlet-name名称即可.如下图

  2. JAVA多线程提高六:java5线程并发库的应用_线程池

    前面我们对并发有了一定的认识,并且知道如何创建线程,创建线程主要依靠的是Thread 的类来完成的,那么有什么缺陷呢?如何解决? 一.对比new Threadnew Thread的弊端 a. 每次ne ...

  3. JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制

    本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...

  4. 认识单点登录cas

    么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分 1.登录 相比于单 ...

  5. Vmware安装ubuntu详细教程

    1.环境准备: (1) 范例系统为WIN10 64位家庭普通版,已正确安装虚拟机VMware Workstation 12 Pro.(2) 下载Ubuntu系统. 2.安装过程: 2.1 VMware ...

  6. Java多线程学习(七)并发编程中一些问题

    本节思维导图: 关注微信公众号:"Java面试通关手册" 回复"Java多线程"获取思维导图源文件和思维导图软件. 多线程就一定好吗?快吗?? 并发编程的目的就 ...

  7. OGG生成数据定义文件的参数NOEXTATTR

    ./defgen paramfile ./dirprm/jzjj.prm NOEXTATTR In OGG 11.2, there is a new parameter NOEXTATTR. This ...

  8. php审计学习:xdcms2.0.8注入

    注入点Fields: 注册页面会引用如下方法: $fields 变量是从 $fields=$_POST['fields']; 这里获取, 在代码里没有过滤. 打印 fields 数据查看: 从代码上看 ...

  9. Delphi 10 seattle 去掉自带的代码连接线

  10. 005zabbix3.0报错记录

    一.问题描述 在zabbix_server添加变量时,出现了以下的报错,