ZK@3.8源码-06-RequestProcessor
ZK请求处理责任链,ZK服务器要处理的请求都要经过这个职责链,该链表通过ZK实例中的firstProcessor
维护着。
1 职责链创建时机
回顾一下ZK启动流程。
java
1 |
|
创建了三个处理器,并将这三个处理器按照一定顺序作为但链表节点串起来,将链表头指针维护在ZK实例中,也就是firstProcessor
。
以后所有的请求都交给firstProcessor
,由其按照职责链设计模式进行执行。
java
1 |
|
2 类图
从类图中可以得到两个信息:
- 三个处理器都是RequestProcessor的派生类,因此要关注接口中声明的方法
processRequest
。 PreRequestProcessor
和SyncRequestProcessor
同时又是Thread
的派生类,也就是说这两个处理器本质是线程,因此其运行模型就是线程执行,关注其run()
方法就行。
3 PreRequestProcessor
3.1 processRequest()方法
java
1 |
|
3.2 run()方法
java
1 |
|
PreRequestProcessor的处理逻辑,该处理器完成两个步骤:
- PreRequestProcessor要完成的定制化处理逻辑
- 将请求转发给下一个处理器SyncRequestProcessor
java
1 |
|
4 SyncRequestProcessor
4.1 构造方法
因为SyncRequestProcessor要对数据进行持久化,而自己没有这个能力,因此要借助其他组件,在构造方法的时候就显式指定。
java
1 |
|
4.1 processRequest()方法
跟PreRequestProcessor
基本一致,都是将请求缓存到阻塞队列中,给线程去轮询。
java
1 |
|
4.2 run()方法
逻辑复杂,但是流程简单。SyncRequestProcessor主要就负责两件事情:
- 对请求创建事务日志记下来,这部分需要组件ZKDatabase完成。
- 可能对内存数据打快照,这部分需要组件FileTxnSnaplog完成。
java
1 |
|
5 FinalRequestProcessor
5.1 构造方法
java
1 |
|
5.2 processRequest()方法方法
该方法内部处理包括:
- 根据请求对内存进行更新
- 将请求对应的响应发回给客户端
java
1 |
|
6 组件流程图
ZK@3.8源码-06-RequestProcessor
https://bannirui.github.io/2023/03/06/ZK-3-8源码-06-RequestProcessor/