本文作者:HelloGitHub-老荀

好久没更新 ZK 的文章了,我想死你们啦。之前发布的 HelloZooKeeper 系列文章完结后,项目收获了将近 600 个 star。这远远超过了我自己的预期,在这里感谢大家的支持~

后面会继续 ZooKeeper 的话题,通过单篇的形式就某个 ZK 的话题继续聊,今天我们先来看看 ZK 的节点类型。话不多说,我们进入今天的主题~

一、关于 ZK 的节点类型

大家如果刷过 ZK 相关面试题的话,就一定会刷到过 “ZK 有几种节点类型?”,大家通常背书的答案的话是:4 种!但其实 ZK (3.6.2)服务端支持 7 种节点类型,分别是:

  • 持久
  • 持久顺序
  • 临时
  • 临时顺序
  • 容器
  • 持久 TTL
  • 持久顺序 TTL

这 7 种类型之前的文章中也有提到过,但是并没有展开讲。这次更新的单篇想要把这 7 种类型的节点,认认真真的讲一遍!Let's GO

二、简单介绍

2.1 持久、临时

持久不用我多说,是用的最多的一种类型,也是默认的节点类型,临时节点相较于持久节点来说,就是它会随着客户端会话结束而被删除,通常可以用在一些特定的场景,例如分布式锁释放,健康检查等。

2.2 持久顺序、临时顺序

这两种我放在一起介绍,因为他们相对于上面两种的特性就是 ZK 会自动在这两种节点之后增加一个数字的后缀,而路径 + 数字后缀是能保证唯一的,这数字后缀的应用场景可以实现诸如分布式队列,分布式公平锁等。

2.3 容器

容器节点是 3.5 以后新增的节点类型,只要在调用 create 方法时,指定 CreateModeCONTAINER 即可创建容器的节点类型,容器节点的表现形式和持久节点是一样的,但是区别是 ZK 服务端启动后,会有一个单独的线程去扫描,所有的容器节点,当发现容器节点的子节点数量为 0 时,会自动删除该节点,除此之外和持久节点没有区别,官方注释给出的使用场景是 Container nodes are special purpose nodes useful for recipes such as leader, lock, etc. 说可以用在 leader 或者锁的场景中。

2.4 持久 TTL、持久顺序 TTL

关于持久顺序这两个关键字,不用我再解释了,这两种类型的节点重点是后面的 TTLTTLtime to live 的缩写,指带有存活时间,简单来说就是当该节点下面没有子节点的话,超过了 TTL 指定时间后就会被自动删除,特性跟上面的容器节点很像,只是容器节点没有超时时间而已,但是 TTL 启用是需要额外的配置(这个之前也有提过)配置是 zookeeper.extendedTypesEnabled 需要配置成 true,否则的话创建 TTL 时会收到 Unimplemented 的报错

三、原理介绍

单纯的持久临时节点我就不介绍了,之前的系列文章有讲

3.1 顺序关键字

客户端创建一个顺序节点的时候,服务端得知当前节点是顺序节点的时候会自动给路径加上后缀,后缀就是父节点的 cversion,代表创建子节点的个数

if (createMode.isSequential()) {
path = path + String.format(Locale.ENGLISH, "%010d", parentCVersion);
}

就是这么简单~

3.2 容器、TTL 关键字

这两种其实可以放在一起讲,服务端在启动的时候会额外启动一个定时任务线程,会定期的扫描所有的容器TTL 的节点,逐一判断子节点的数量以及一些相关配置,来决定是否删除,首先整个逻辑是在 ContainerManager 中,定时任务是由 TimeTask 实现的,相关的配置有

配置项 默认值 说明
znode.container.checkIntervalMs 60000(毫秒) 定时任务检查的间隔
znode.container.maxPerMinute 10000 和上面的参数联合成为最小的检查间隔,每个节点间隔必须差 (60000 / 10000)毫秒(默认 6 毫秒)以上
znode.container.maxNeverUsedIntervalMs 0 如果配置不为 0 的话,当容器TTL 节点最后一次更新的时间和当前时间戳的差超过这个值的话,也会被删除

四、小结

  • 持久关键字:客户端不主动删除的话,节点数据会一直存在
  • 临时关键字:客户端连接断开后,节点数据会被一起删除
  • 顺序关键字:服务端会自动为该节点加数字后缀
  • 容器:服务端会定期扫描这些节点,当该节点下面没有子节点时(或其他条件时)服务端会自动删除节点
  • TTL:需要额外配置才能启用,基本和容器相同,当超过 TTL 时间节点下面都没有再创建子节点时会被删除,但是当创建子节点会重置该超时时间

ZKr~好久没更了,这次先挑一个简单的话题。后面大家想学哪些 ZK 的知识可以留言告诉我。


关注 HelloGitHub 公众号 第一时间收到更新。

还有更多开源项目的介绍和宝藏项目等待你的发现。

面试官问:ZooKeeper 有几种节点类型?别再说 4 种啦!的更多相关文章

  1. 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

    这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...

  2. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  3. 面试官:Zookeeper是什么,它有什么特性与使用场景?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Zook ...

  4. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  5. 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush

    「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员‍,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...

  6. 面试官问我,Redis分布式锁如何续期?懵了。

    前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所 ...

  7. 面试官问:JS的this指向

    前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...

  8. 面试官问线程安全的List,看完再也不怕了!

    最近在Java技术栈知识星球里面有球友问到了线程安全的 List: 扫码查看答案或加入知识星球 栈长在之前的文章<出场率比较高的一道多线程安全面试题>里面讲过 ArrayList 的不安全 ...

  9. 美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

    本文首发于微信公众号:程序员乔戈里 public class testT { public static void main(String [] args){ String A = "hi你 ...

随机推荐

  1. (数据科学学习手札118)Python+Dash快速web应用开发——特殊部件篇

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  2. Ionic5沉浸式状态栏 适配全面屏

    1. 在platforms/android/app/src/main目录中找到AndroidManifest.xml文件,修改文件中manifest → application → activity标 ...

  3. 模拟退火算法Python编程(3)整数规划问题

    1.整数规划问题 整数规划问题在工业.经济.国防.医疗等各行各业应用十分广泛,是指规划中的变量(全部或部分)限制为整数,属于离散优化问题(Discrete Optimization). 线性规划问题的 ...

  4. Java基础常用类深度解析(包含常见排序算法)

    目录 一.工具类 1.1.工具类的设计 1.1.1.公共静态方法 1.2.单例模式 二.包装类 2.1.基本类型的包装类 2.1.1.Integer 2.1.1.1.Integer >> ...

  5. php自定义配置文件简单写法

    1 <?php 2 header("Content-type:text/html;charset=utf-8"); 3 4 $q = getconfig('rr'); 5 e ...

  6. hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)

    题意:       给你两个数n,k问你是否怎在这样一个序列:      (1)这个序列有k个正整数,且不重复.      (2)这k个数的和是n.      (3)其中有k-1个数的和是一个平方数. ...

  7. hdu4975 行列和构造矩阵(dp判断唯一性)

    题意:       和hdu4888一样,只不过是数据加强了,就是给你行列的和,让你构造一个矩阵,然后判断矩阵是否唯一. 思路:       构造矩阵很简单,跑一次最大流就行了,关键是判断矩阵的唯一性 ...

  8. UVA11384正整数序列(把123..变成0的最小步数)

    题意:      给定一个正整数n,你的任务是最少的操作次数把序列1 2 3 4 5...n中所有的数字都变成0,每次操作可以从序列中选择一个活多个整数,同时减去一个相同的正整数,比如 1 2 3可以 ...

  9. c/c++ 中访问2维数组的方式

    指针是c的灵魂,这个真是不容置疑,太灵活了,太随意了, 当然,如果理解了,用得好,比弱类型语言的var 用的还舒服, 用的不好,那就是程序的灾难,哈哈,不多说了,访问二维或多维数组有如下几种方式,下面 ...

  10. 【python】Leetcode每日一题-132模式

    [python]Leetcode每日一题-132模式 [题目描述] 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j &l ...