ZooKeeper:Java客户端互连网处理

     了然ZooKeeper客户端的落到实处,对于使用ZooKeeper的客户端十三分主要。
通过对客户端源码的读书,了然了之类新闻:

   
 创立ZooKeeper对象时,应会创造三个ClientCnxn(代表了客户端连接对象)。与此同时运维了四个线程:SendThread、伊芙ntThread。三个连串:outgoingQueue和pendingQueue。

        

 

同步调用:

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

       
 这行代码会倡导贰个合伙调用。二个线程A执行那一个create时,会成立1个意味create动作的packet,放到数据发送队列outgoingQueue。之后当线程A就起来等候,直到SendThread线程从outgoingQueue队列抽出该packet,并将其成功发送(已收到服务端的答疑为准)。然后线程A才继续推行。

 

异步调用:

        
异步调用,正是客户端不会管请求是还是不是发送成功,都会继续施行。例如:zk.create(path,data,acl,createMode,stringCallback);

       
 那行代码会倡导3个异步调用。3个线程A实施那几个create时,会创造一个代表create动作的packet,放到数据发送队列outgoingQueue。线程A接着就去施行下一行代码了,而不会去管数据packet是还是不是由SendThread线程发送到服务端了。

 

 

SendThread的职责:

一:成立多少个长连接,用于会话保持

     通过周期性的殡葬ping
packet到近期一而再的ZooKeeper服务器实例。这几个历程,大家普通号称心跳。每当客户端与服务端的连接断开后,会自动重新连接到下1个服务器。尽管断开的是终极与一个服务器的连天,那么会重复连接到第贰个服务器。

二:使用那一个长连接与服务器通讯

     一)发送客户调用

   
 不断的从outgoingQueue抽出packet发给服务端。当发送的是Client的一块调用的packet,则在发送packet后,立刻通报客户端一齐调用线程继续实施。当发送的是Client的异步调用,则会将packet发给服务端,并保留到pendingQueue。当从服务端发回响应后,生成3个packet
实现事件交给伊夫ntThread,由伊夫nt试行CallBack调用。

二)处理服务端响应

     对服务端响应反系列化后,依据响应分类开始展览处理如下:

     · Ping的响应:不做拍卖

     ·
认证失利的响应:成立认证战败的沃特ched伊芙nt,并将event交给伊夫ntThread处理。

     ·
服务端的数量变动文告:生成对应的数目改换Watched伊芙nt,并将event交给伊芙ntThread处理。

     ·
服务端对调用的应对:不论是联合签字调用仍旧异步调用,服务端都会交到回应。收到此类回应后,先是将watcher放到watcherManager中。然后对共同、异步做继续处理。

              假如是一路调用,则布告发起调用的线程继续处理。

             
假如是异步调用,则将该packet交由伊芙ntThread来处理。例如对create、delete、exists、getData、getChildren方法调用的响应。

 

伊芙ntThread做了怎么样事呢?

 

   
 从上述描述中,也得以看到伊夫ntThread用于对吸收接纳到的packet可能event举办处理:

     · 假使是event,则从沃特cherManager中抽取相应的沃特cher进行拍卖。

     · 要是是packet,则推行相关联的AsyncCallback。

 

经过源码的开卷,知道在动用ZooKeeper客户端时要专注以下两点:

       
· 在展开沃特cher回调时,会从沃特chManager抽取与有关path关联的两个沃特cher(此时WatchManager中就不会再有这一个path相关的沃特cher了),然后串行的调用那四个沃特cher#process方法。所以在编制程序时,会遵照作业的急需,有极大希望会反复注册沃特cher。

        ·
其余因为多少个沃特cher的调用是串行的,所以不用因为二个沃特cher的处理逻辑影响了全部客户端的沃特cher回调。

 

相关文章