SendThread功能
- 负责建立socket连接
- 负责从outgoingQueue中获取命令数据发送给服务端
-
- ping命令
- CRUD命令
- auth命令
- 负责读取服务端响应数据
-
- ping的结果
- auth结果
- 通知
-
-
- 监听器事件:添加到waitingEvents队列中。
-
-
- 设置数据包Packet的响应信息
- 注册监听器
- 如果是异步调用,则把Packet添加到waitingEvents队列中。
- 如果是同步调用,则notifyAll
EventThread功能
- 从waitingEvents队列中获取数据
-
- 执行监听器事件
- 执行Packet的异步调用
- 执行eventOfDeath事件:关闭EventThread线程(执行quit命令是会向waitingEvents队列中添加该事件)
重连逻辑
Zookeeper对象,表示一个Zookeeper客户端
当服务端挂掉后,Zookeeper对象并没有消失,会不断的进行重连,socket连接建立好了之后,会先发送一个ConnectRequest对象,该对象包括:
- 当前Zookeeper对象,最近一次接受到的响应中的zxid(第一次连接时为0)
- 当前Zookeeper对象中存的sessionId(第一次连接时为0)
服务端侧,服务端重启时,会从快照和日志记录中进行重放,其中就包括session的重新创建,所以一个session不是被正常关闭的,那么服务器重启时能恢复session,包括临时节点也是一样的,服务端重启后,如果接收到一个ConnectRequest对象,发现其sessionId不为空,那么还会去touchSession,更新session的过期时间,这样就保证了服务器重启后,临时节点所对应的session只要还没有超过过期时间,临时节点依然存在。
在Zookeeper对象内部有一个ZKWatchManager对象。
ZKWatchManager对象是用来管理客户端上的存在的Watches,在连接初始化时会判断当前客户端上是否存在Watche,如果存在会批量重新注册到服务端,这样也就保证了客户端所注册的watch在服务端重启后依然存在。
https://www.processon.com/view/link/5e918810f346fb4bdd5eb007