Zookeeper通知机制为啥用watch?他是怎样设计的
2021-05-12 本文已影响0人
进击的三文鱼
一 前言
Zookeeper是一个广受大家喜爱的框架,他能搞定分布式锁,也能实现服务之间更好的调用,而他是通过通知机制来实现的,那么他是怎么实现的呢?下面就来一步一步聊一聊
二 Zookper的数据结构
image.png- workers是父节点,下面的每一个子节点都保存系统中每一个从节点的信息
- tasks是父节点,下面的znode子节点保存已将创建并等待从节点执行任务的信息
- assign是父节点,下面的znode子节点保存了分派到某个从节点的一个一个任务信息
三 znode的不同类型
- 持久节点:会持久化到硬盘
- 临时节点:当超时和主动关闭就会消失,客户端主动删除也会消失
- 有序持久节点:/tasks/task-1 /tasks/task-2 可以直观的看到任务的创建顺序
- 临时有序节点:就是临时节点+有序
四 监视与通知的设计
根据上面的知识基础,我们基本了解了zookeeper的面貌,下面就是他的通知机制的设计
zookeeper的客户端向zookeeper发送要执行的任务,发完了之后一种设计是每次客户端都去查询这个任务有没有被执行,这样查很多遍显然是不够聪明的
所以zookeeper采用了通知的机制,这种机制就是在zookeeper上设置一个监视点,当客户端第一次访问的时候把监视点watcher放到zookeeper上,然后客户端就不用管,这时候消费者,访问了zookeeper,处理了这个任务,那么watch就登场了,他会主动向客户端发送消息,告诉客户端任务被处理了,然后watch自己就移除掉,这样就不用客户端来没一次查询了。
这个就是watch的意义,是一种很聪明的做法,依据他就知道为什么代用zookeeper要使用watch。
五 Zookeeper的架构
- 独立模式:有一个服务器,Zookeeper状态无法复制
- 仲裁模式:由一组服务器组成,也就是分布式的,多个服务器投票选出一个主节点