文中转载微信公众平台「HelloGitHub」,创作者HelloGitHub。转截文中请联络HelloGitHub微信公众号。
大伙儿假如过 ZK 有关面试问题得话,就一定会刷出过 “ZK 有几种连接点种类?”,大伙儿一般背诵的回答得话是:4 种!但实际上 ZK (3.6.2)服务器端适用 7 种连接点种类,分别是:
这 7 种种类以前的文章内容中也有提及过,可是并沒有进行讲。此次升级的每篇要想把这 7 种种类的连接点,一丝不苟的讲一遍!Let's GO
长久无需我多讲,是用的数最多的一种种类,也是默认设置的连接点种类,临时性连接点相比于长久连接点而言,便是它会伴随着手机客户端对话完毕而被删掉,一般可以用在一些特殊的情景,比如分布式锁释放出来,健康体检等。
这二种我放到一起详细介绍,由于她们相对性于上边二种的特点便是 ZK 会全自动在这里二种连接点以后提升一个数据的后缀名,而途径 数据后缀名是能确保唯一的,这数据后缀名的应用领域能够完成例如分布式系统序列,分布式系统公平公正锁等。
器皿连接点是 3.5 之后增加的连接点种类,只需在启用 create 方式时,特定 CreateMode 为 CONTAINER 就可以建立器皿的连接点种类,器皿连接点的表达形式和长久连接点是一样的,可是差别是 ZK 服务器端运行后,会有一个独立的进程去扫描仪,全部的器皿连接点,当发觉器皿连接点的子连接点总数为 0 时,会全自动删掉该连接点,此外和长久连接点沒有差别,官方网注解得出的应用情景是 Container nodes are special purpose nodes useful for recipes such as leader, lock, etc. 说可以用在 leader 或是锁的情景中。
有关长久和次序这两个关键词,无需我再表述了,这二种种类的连接点关键是后边的 TTL,TTL 是 time to live 的简称,指含有生存時间,简易而言便是当该连接点下边沒有子连接点得话,超出了 TTL 特定時间后便会被全自动删掉,特点跟上边的器皿连接点很像,仅仅器皿连接点沒有请求超时時间罢了,可是 TTL 开启是必须 附加的配备(这一以前也是有提过)配备是 zookeeper.extendedTypesEnabled 必须 配备成 true,不然得话建立 TTL 的时候会接到 Unimplemented 的出错
单纯性的长久和临时性连接点我不详细介绍了,以前的系列产品文章内容有讲
手机客户端建立一个次序连接点的情况下,服务器端获知当今连接点是次序连接点的情况下会全自动给途径再加上后缀名,后缀名便是父节点的 cversion,意味着建立子连接点的数量
- if (createMode.isSequential()) {
- path = path String.format(Locale.ENGLISH, "0d", parentCVersion);
- }
便是那么简易~
这二种实际上能够放到一起讲,服务器端在运行的情况下会附加运行一个计划任务进程,会按时的扫描仪全部的器皿和 TTL 的连接点,逐一分辨子连接点的总数及其一些有关配备,来决策是不是删掉,最先全部逻辑性是在 ContainerManager 中,计划任务是由 TimeTask 完成的,有关的配备有
配备项 | 初始值 | 表明 |
---|---|---|
znode.container.checkIntervalMs | 60000(ms) | 计划任务查验的间距 |
znode.container.maxPerMinute | 10000 | 和上边的主要参数协同变成最少的查验间距,每一个连接点间距务必差 (60000 / 10000)ms(默认设置 6 ms)之上 |
znode.container.maxNeverUsedIntervalMs | 0 | 假如配备不以 0 得话,当器皿和 TTL 连接点最后一次升级的時间和当前时间戳的差超出这一值得话,也会被删掉 |