ZK@3.8源码-11-QuorumCnxManager组件
1 QuorumCnxManager实例化
通过构造方法创建了QuorumCnxManager组件,并且Listener是QuorumCnxManger中的一个组件,也在构造方法中创建出来了。
java
1 |
|
java
1 |
|
java
1 |
|
2 Listener实例化
并没有什么特别之处,简单地进行一些赋值操作。
java
1 |
|
3 组件图
至此,QuorunCnxManager组件模型如下,Listener是个线程,必要start()线程使其处于就绪状态,等到CPU调度之后回调run()方法的。
有了这个思路,下面就直接看Listener的这两个方法:
- start()
- run()
4 Listener的核心方法
4.1 start()
Listener没有重写父类start(),那么直接关注run()方法中的回调逻辑即可。
4.2 run()
简单而言就是启动监听器专门监听在投票端口上,既然是服务端Socket,必然会有Accept事件和Read事件,这些逻辑就由这个监听处理器去负责。
java
1 |
|
4.3 ListenerHandler
本质是个Runnable任务,上面代码看出来是丢在线程池异步执行的,关注它的run()实现。
run()方法
该方法是入口。
java
1 |
|
4.3.1 服务端接收投票端口的连接请求
代码比较多,但是核心就是服务器节点作为服务端监听在投票端口上,阻塞等待来自其他节点的连接请求,其他节点的角色就是客户端。
java
1 |
|
4.3.2 服务端接收投票端口的数据发送
对于Socke编程而言,就是服务端阻塞等待read发生,接收到来自客户端数据后按照什么约定的协议进行读取以及怎么处理业务逻辑。
java
1 |
|
我也注释了ZK中约定的投票通信发起的规则。
作为Socket通信的服务端而言,如果度过了所有的阻塞accept
和read
,才能执行到最后,启动两个线程使他们处于就绪态等改被回调执行。
java
1 |
|
4.4 工作线程
关注工作线程的run()方法。
4.4.1 SenderWorker
java
1 |
|
4.4.2 RecvWorker
java
1 |
|
5 流程图
至此,QuorumCnxManager组件的功能已经线程工作模型已经清晰了,但是还有两个问题需要跟后面的组件进行关联:
- recvQueue存放的是,节点服务作为服务端(小sid)接收到的来自客户端(大sid)的消息,这些数据需要怎么进行业务逻辑
- 哪个组件关注这部分数据
- 怎么取
- 取出来怎么处理
- queueSendMap里面存放的是,节点服务作为客户端(大sid)准备发送的数据,并且已经缓存了要发送给谁(服务端,小sid)
- 哪个组件关注这部分数据
- 怎么放
- 放进去的数据是怎么来的
当前环节是处于选主阶段,这些数据都是通过配置好的选举投票端口进行通信的,那么真正对这些数据存取的肯定都是选主算法组件。
ZK@3.8源码-11-QuorumCnxManager组件
https://bannirui.github.io/2023/03/09/ZK-3-8源码-11-QuorumCnxManager组件/