Zookeeper客户端

本文介绍了ZooKeeper客户端连接服务端的类ClientCnxn的工作原理,包括SendThread和EventThread两个内部线程的作用及交互流程。详细解释了客户端如何发送请求并接收响应事件,以及事件的处理过程。

线程模型

ClientCnxn是客户端连接服务端的类,它两个内部类SendThread、EventThread

1. sendThread线程负责从与server端建立连接、定时发送心跳消息、从outgoingQueue队列中取得任务,并通过tcp连接将请求发送到server端

2. SendThread类收到server端响应事件后,向waitingEvents队列中addwatcher对象,由EventThread从waitingEvents队列中获取事件,判断事件类型,回调客户端的Watcher实现类WatchRegistration  存放pathwatcher

 看它的线程栈

Exists过程

1. 先把Watcher和Path构造成WatchRegistration(watcher注册器) ,再构造RequestHeader, ExistsRequest和SetDataResponse然后把这几个对象用ClientCnxn方法submitRequest提交;

2. submitRequest里面做的事:上面传过来的参数构造成Packet, 再构造一个ReplyHeader放入Packet中, Packet放入outgoingQueue 这里加了outgoingQueue同步, 返回一个Packet, 然后根据packet.finished循环等待 ;

3. 最后sendThread它里面的ClientCnxnSocketSelector唤醒

4. SendThread run里面把outgoingQueue里面数据往服务端发送

5. SendThread收到服务端数据数据解析成WatchedEvent,调用EventThread的queueEvent, queueEvent会根据类型、路径把watchers来放到WatcherSetEventPair,

WatcherSetEventPair有watchEventSet<Watcher>构成waitingEvents里面存放的就是WatcherSetEventPair所以EventThread run就循环调用这些watcher的process方法。

6. 所以pendingQueue存放请求packet的上面queuePacket加了同步,所有packet是按顺序的 ,到pendingQueue里面第一个packet取出来,把返回的数据解析放到原来的packet中,最后 finish该packet。

转载于:https://my.oschina.net/chengxiaoyuan/blog/680063

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值