zookeeper学习笔记之-Zookeeper连接建立流程

本文详细介绍了Zookeeper客户端的SendThread功能,包括建立socket连接、发送各种命令以及处理服务端响应。EventThread则负责处理等待事件,执行监听器回调。当服务端断开连接时,客户端会自动重连,并在连接恢复时重新注册 Watches,确保session和临时节点的连续性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SendThread功能

 

  1. 负责建立socket连接
  2. 负责从outgoingQueue中获取命令数据发送给服务端
    1. ping命令
    2. CRUD命令
    3. auth命令
  1. 负责读取服务端响应数据
    1. ping的结果
    2. auth结果
    3. 通知
      1. 监听器事件:添加到waitingEvents队列中
    1. 设置数据包Packet的响应信息
    2. 注册监听器
    3. 如果是异步调用,则把Packet添加到waitingEvents队列中。
    4. 如果是同步调用,则notifyAll

 

EventThread功能

  1. waitingEvents队列中获取数据
    1. 执行监听器事件
    2. 执行Packet的异步调用
    3. 执行eventOfDeath事件:关闭EventThread线程(执行quit命令是会向waitingEvents队列中添加该事件)

 

 

重连逻辑

 

Zookeeper对象,表示一个Zookeeper客户端

 

当服务端挂掉后,Zookeeper对象并没有消失,会不断的进行重连,socket连接建立好了之后,会先发送一个ConnectRequest对象,该对象包括:

  1. 当前Zookeeper对象,最近一次接受到的响应中的zxid(第一次连接时为0)
  2. 当前Zookeeper对象中存的sessionId(第一次连接时为0)

 

服务端侧,服务端重启时,会从快照和日志记录中进行重放,其中就包括session的重新创建,所以一个session不是被正常关闭的,那么服务器重启时能恢复session,包括临时节点也是一样的,服务端重启后,如果接收到一个ConnectRequest对象,发现其sessionId不为空,那么还会去touchSession,更新session的过期时间,这样就保证了服务器重启后,临时节点所对应的session只要还没有超过过期时间,临时节点依然存在。

 

在Zookeeper对象内部有一个ZKWatchManager对象。

 

ZKWatchManager对象是用来管理客户端上的存在的Watches,在连接初始化时会判断当前客户端上是否存在Watche,如果存在会批量重新注册到服务端,这样也就保证了客户端所注册的watch在服务端重启后依然存在。

 

https://www.processon.com/view/link/5e918810f346fb4bdd5eb007

Zookeeper连接建立流程.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值