ZooKeeper:Java客户端网络拍卖

     了解ZooKeeper客户端的贯彻,对于用ZooKeeper的客户端好关键。
通过对客户端源码的阅读,了解了之类信:

   
 创建ZooKeeper对象时,应会创建一个ClientCnxn(代表了客户端连接对象)。与此同时启动了有限独线程:SendThread、EventThread。两个队:outgoingQueue和pendingQueue。

        

 

齐调用:

        
同步调用,就是客户端成功发送请求后,才继续执行。例如:zk.create(path,data,acl,createMode);

       
 这行代码会倡导一个联袂调用。一个线程A执行这create时,会创造一个象征create动作之packet,放到数据发送队列outgoingQueue。之后当线程A就从头等待,直到SendThread线程从outgoingQueue队列取出拖欠packet,并以那成功发送(已接服务端的回复也遵循)。然后线程A才继续执行。

 

异步调用:

        
异步调用,就是客户端不见面无要是否发送成功,都见面继续执行。例如:zk.create(path,data,acl,createMode,stringCallback);

       
 这行代码会发起一个异步调用。一个线程A执行是create时,会创一个意味着create动作之packet,放到数据发送队列outgoingQueue。线程A接着就是失去执行下一行代码了,而无见面去随便数据packet是否由于SendThread线程发送至服务端了。

 

 

SendThread的职责:

1:创建一个添加连,用于会话保持

     通过周期性的出殡ping
packet到当下一连的ZooKeeper服务器实例。这个进程,我们通常号称心跳。每当客户端和劳动端的连天断开后,会活动重新连接至下一个服务器。如果断开的是最后及一个服务器的接连,那么会另行连接到第一只服务器。

2:使用此长连和服务器通信

     1)发送客户调用

   
 不断的从outgoingQueue取出packet发给服务端。当发送的是Client的一块儿调用的packet,则当殡葬packet后,立即通报客户端并调用线程继续执行。当发送的凡Client的异步调用,则会用packet发给服务端,并保留到pendingQueue。当从劳动端发回响应后,生成一个packet
完成事件交给EventThread,由Event执行CallBack调用。

2)处理服务端响应

     对服务端响应反序列化后,根据响应分类开展拍卖如下:

     · Ping的应:不开处理

     ·
认证失败的应:创建认证失败的WatchedEvent,并拿event交给EventThread处理。

     ·
服务端的数目变动通知:生成对应的数码变更WatchedEvent,并拿event交给EventThread处理。

     ·
服务端对调用的回答:不论是联合调用还是异步调用,服务端都见面被来对。收到此类回应后,先是将watcher放到watcherManager中。然后针对合、异步做继续处理。

              如果是同调用,则通发起调用的线程继续处理。

             
如果是异步调用,则用欠packet交由EventThread来拍卖。例如对create、delete、exists、getData、getChildren方法调用的应。

 

EventThread举行了什么事啊?

 

   
 从上述描述着,也得观看EventThread用于对收取到的packet或者event进行拍卖:

     · 如果是event,则打WatcherManager中取出相应的Watcher进行处理。

     · 如果是packet,则行相关联的AsyncCallback。

 

经过源码的翻阅,知道在动用ZooKeeper客户端时要留意以下简单触及:

       
· 在进展Watcher回调时,会于WatchManager取出与连锁path关联的大都个Watcher(此时WatchManager中即使不见面重复来之path相关的Watcher了),然后串行的调用这差不多个Watcher#process方法。所以于编程时,会依据业务的得,有或会见频注册Watcher。

        ·
另外为大多独Watcher的调用是串行的,所以并非因一个Watcher的拍卖逻辑影响了周客户端的Watcher回调。

 

相关文章