在ZooKeeper源码解析(7)-请求处理(上)和ZooKeeper源码解析(8)-请求处理(下)中,我们已经介绍过了,ZooKeeperServer主要就是通过RequestProcessor来进行生产链似的处理请求.
那么,在这篇文章中,我们就来介绍一下这几种RequestProcessor.
几种RequestProcessor的实现
在ZooKeeper中,主要有下面几种RequestProcessor:
- AckRequestProcessor
- CommitProcessor
- FinalRequestProcessor
- FollowerRequestProcessor
- ObserverRequestProcessor
- PrepRequestProcessor
- ProposalRequestProcessor
- ReadOnlyRequestProcessor
- SendAckRequestProcessor
- SyncRequestProcessor
- ToBeAppliedRequestProcessor
- UnimplementedRequestProcessor
这些RequestProcessor都实现了RequestProcessor接口.
我们来看一下RequestProcessor这个接口.
其中处理请求的就是processRequest(Request request)这个方法.
PreRequestProcessor
PreRequestProcessor一般是放在处理链的起始部分的,它对请求做一些预处理,比如:
- 检查Session
- 检查要操作的节点及其父节点是否存在
- 检查客户端是否有权限
PreRequestProcessor继承自ZooKeeperCritialThread,它的processRequest(Request request)方法只是将request加到submittedRequests中.
在它的run()方法中,会不断从submittedRequests中的内容并进行处理.
ProposalRequestProcessor
ProposalRequestProcessor用于向Follower发送Proposal,来完成Zab算法.
正如我们在上面代码中注释写的那样,有一部分Request是不需要进行提议的,比如,来自Follower的请求转发的Request.
SyncRequestProcessor
SyncRequestProcessor用于将请求持久化到磁盘中.
AckRequestProcessor
AckRequestProcessor实现的功能特别简单,就是在同意Leader的Proposal之后,给Leader回复一个ACK.
CommitProcessor
这个CommitProcessor用于将来到的commit request和本地已提交的request进行对比.
FinalRequestProcessor
FinalRequestProcessor负责将Transaction Log应用到DataTree上,并给客户端回复.
其他RequestProcessor
其他的繁杂的RequestProcessor,我们这里就不介绍了,大多数都是实现很简单的功能.比如,FollowerRequestProcessor实现将请求从Follower转发到Leader.
总结
这篇文章中,其实对各种RequestProcessor的实现并没有进行深入的解析,而只是大体介绍了一下它们的功能.其实大多数都很简单,只有那个ProposalRequestProcessor比较复杂.
在ZooKeeper中,对每个请求,都是通过这种生产链的方式,一步步地进行处理.感觉这样特别美观.