zookeeper - 读数据(6)

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 概述    在写完zookeeper的写数据过程的文章之后,需要继续写一篇读数据过程的文章,这篇文章就是因此而来的。我们直接通过getData作为一个例子来说明这个过程,其他的exist/getChildren之类的方法类似。

概述

    在写完zookeeper的写数据过程的文章之后,需要继续写一篇读数据过程的文章,这篇文章就是因此而来的。我们直接通过getData作为一个例子来说明这个过程,其他的exist/getChildren之类的方法类似。

    下面通过一个demo例子进行说明,基本上我们就可以看出来getData的api用法,我们就以这个作为例子开始进入数据读取过程的分析。几个核心的知识点包括核心回调(processResult)、watcher(process)等,当然创建Zookeeper的时候最后一个this其实就是一个watcher对象。


zookeeper-client源码

    在zookeeper获取server端数据的整个过程中,其实还是分两步走,组装数据+发送报文,发送报文的操作由sendThread完成实现的,其他的需要注意的就是packet当中包含了watcher和callback。


img_cb017962db9eaf49e231f9f8fdf5e0a4.png
client-1

说明:

    直接看出来zookeeper的getData的api,注意实现了Watcher接口和DataCallback接口。


img_f75f4cccd9c42db4ae63937eef7a3e63.png
client-2

说明:

    这里我们可以看到有个watchManager.defaultWatch=watcher的赋值,这里其实就是绑定了我们新建zookeeper对象的时候传进来的watcher。


img_730123b38a6e5c3d1f68b23d3ac9f2f4.png
client-3

说明:

    组装报文并通过queuePacket放置到sendThread的发送队列当中。


img_d8a95f367ed5aa4913307e16e7ac20b0.png
client-4

说明:

    将packet添加到outgoingQueue当中,由sendThread完成报文发送。


zookeeper-server源码

    zookeeper的server端在处理getData的请求的时候,这里整个处理流程依然是按照:PrepRequestProcessor,SyncRequestProcessor和FinalRequestProcessor依次进行处理。

    在整个过程中,除了关注获取数据的流程,还需要关注getData添加了watcher的过程,也就说针对具体的path我们增加了watcher,其实这个watcher本质上是server端和client端建立的连接的socket,也就是说我们通过维护了path和watcher的映射关系,这样子每次特定的path发生了数据的变更,然后通过socket连接通知client进行事件处理。

    整个过程watcher机制的过程应该比较冗长,后面再具体写文章来阐述。


img_a0d678d86f1cb53d3a88043d839f743c.png
server-1

说明:

    获取client发送的数据,从这个入口开始关注。


img_aeafce23f04632bf561b29e85b9482e3.png
server-2

说明:

    继续跟进readRequest过程。


img_4a312ecaa1e403286732889321ea0a68.png
server-3

说明:

    提交任务到PrepRequestProcessor当中并进行处理。


img_23d5c702194cc4cbb4e56f7426b66bc7.png
server-4

说明:

    PrepRequestProcessor开始进行处理。


img_6e7bf82529ff63a76b90b048f299c414.png
server-5

说明:

    跟进由SyncRequestProcessor进行处理。


img_c2742eef8de53f241a26deee662fbec6.png
server-6

说明:

    跟进FinalRequestProcessor进行处理。


img_6636f00cd7847e9bd6b0e3549f23c9cd.png
server-7

说明:

    开始进行getData的真正处理逻辑,这里面除了获取数据还保存了watcher。


img_eade01c85848e5daa5fc6bce9779f556.png
server-8

说明:

    增加了watcher的机制。


zookeeper-DataTree结构

img_a64d457c44df2847de72672d60ff88fa.png
DataTree

说明:

    在zookeeper中的server端以DataTree保存数据结构,DataTree中包含nodes的k/v集合(其中key为node的path,value为DataNode对象),dataWatches是保存所有data节点的watches,childWatches是保存所有子节点的watches。

    DataNode包含的就是节点的对象,包含数据data、acl、stat、children子节点。

    WatchManager保存的是对应的回调watches。


参考文章

    Zookeeper源码分析之三Exists请求和处理

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
9月前
|
消息中间件 分布式计算 算法
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析(上)
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析
719 0
|
4月前
|
运维 NoSQL 关系型数据库
基于Zookeeper的锁
【10月更文挑战第2天】
31 0
|
9月前
|
监控 算法 网络协议
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析(下)
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析
110 1
|
Unix Shell
Zookeeper系列(二)——Zookeeper的Watch机制
Zookeeper系列(二)——Zookeeper的Watch机制
273 1
Zookeeper系列(二)——Zookeeper的Watch机制
|
Apache 数据库
Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略
Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略
415 0
Zookeeper系列——一文带你了解Zookeeper的选举机制
Zookeeper系列——一文带你了解Zookeeper的选举机制
846 0
Zookeeper系列——一文带你了解Zookeeper的选举机制
|
消息中间件 存储 NoSQL
ActiveMQ系列:基于LevelDB和 Zookeeper 的数据复制集群
LeveDB 5.6版本之后推出了 LevelDB 的持久化引擎,它使用了自定义的索引代替常用的 BTree 索引,其持久化性能高于KahaDB,虽然默认的持久化方式还是 KahaDB,但是 LevelDB 可能会是趋势。在5.9版本还提供了基于 LevelDB 和 Zookeeper 的数据复制方式,作为 Master-Slave 方式的首选数据复制方案。
336 0
ActiveMQ系列:基于LevelDB和 Zookeeper 的数据复制集群
|
Java 关系型数据库 MySQL
ZK(ZooKeeper)分布式锁实现(1)
ZK(ZooKeeper)分布式锁实现
329 2
ZK(ZooKeeper)分布式锁实现(1)
【ZooKeeper】⑤ ZooKeeper 的选举机制
在进行 ZooKeeper 集群启动的时候,集群中会有 Leader 节点和 Follower 节点。 一个集群中只会有一个 Leade r节点。启动 ZooKeeper 集群的时候 Leader 并不是固定的,而是通过一定的选举策略产生的。 选择 Leader 节点的时候需要进行投票(Vote)。其中每个集群节点(服务器)都可以进行投票,并把自己的投票结果发送给其他的所有节点。投票的主要的信息 Vote 包含两个字段 myid 和 zxid myid 是服务器节点的 id(服务器的标记) zxid 是选举的全局事务 id(zxid 每次选举都会递增,选举轮次)
170 0
【ZooKeeper】⑤ ZooKeeper 的选举机制
|
监控
ZK(ZooKeeper)分布式锁实现(2)
ZK(ZooKeeper)分布式锁实现
213 0
ZK(ZooKeeper)分布式锁实现(2)

热门文章

最新文章