ZooKeeper源码解析(9)-几种RequestProcessor

Posted by AlstonWilliams on February 17, 2019

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中,对每个请求,都是通过这种生产链的方式,一步步地进行处理.感觉这样特别美观.