在上一篇文章中讲到QuorumCnxManager,它负责zookeeper服务器在选举期间最底层的网络通信,整个网络涉及到的类如下:
整个网络建立的过程如下:
- 选举前创建好QuorumCnxManager实例,并在QuorumCnxManager构造函数中创建好Listener实例
- 调用
Listener.start()
方法启动监听线程 - Listener获得CPU资源后执行
run()
方法,建立ListenerHandler,开始监听来自其他服务器的连接请求 - 当ListenerHandler监听到来自其他服务器的连接请求,创建当前服务器与目标服务器一对一的SendWorker和RecvWorker,并将SendWorker保存到
QuorumCnxManager.senderWorkerMap
中 - 进行选举的时候会向集群中的所有服务器发送自己的选票,通过
QuorumCnxManager.toSend()
方法向QuorumCnxManager.queueSendMap
中存放待发送的信息,等待SendWorker异步发送 - 在
QuorumCnxManager.toSend()
中会检测senderWorkerMap
中是否存在目标服务器的发送线程SendWorker,如果不存在则调用connectOne()
方法创建连接,connectOne()
中会创建QuorumConnectionReqThread线程并将其放入connectionExecutor
线程池中异步建立连接 - 当QuorumConnectionReqThread获得CPU资源后执行
run()
方法,接着调用QuorumCnxManager.initiateConnection()
方法进行连接,连接建立成功后创建一对一的SendWorker和RecvWorker,并将SendWorker保存到QuorumCnxManager.senderWorkerMap
中 - RecvWorker接收到来自客户端的投票消息,将消息以Message的格式保存在
QuorumCnxManager.recvQueue
中 - 选举期间会循环调用
QuorumCnxManager.pollRecvQueue()
方法从QuorumCnxManager.recvQueue
中获取来自其他服务器的投票并进行处理。
QuorumCnxManager的工作原理大致如此,下文开始逐一具体分析这些类。