ZooKeeper源码解析(8)-请求处理(下)

Posted by AlstonWilliams on February 17, 2019

ZooKeeper源码解析(7)-请求处理(上)的末尾,我们只是提到主要处理请求的方法是PreRequestProcessor中的pRequest()方法,而并没有深入的介绍这个方法的实现.

在这篇文章中,我会介绍创建节点这种请求的处理过程.其他的请求,跟它类似,就不一一深入介绍了.

我们先大体看一下pRequest()方法的实现.

我们可以看到,对于每个请求,都会创建对应的Request对象,然后通过pRequest2Txn()方法进行调用.

上面我们贴出了处理CreateRequest的全部代码.

注释中基本上已经写的很详细了.

这里主要就是总结一下过程:

  • 验证Session是否有效
  • 验证要创建的节点的路径是否正确
  • 验证客户端是否有权限创建节点
  • 创建对应类型的节点的ChangeRecord,主要有下面几种类型:
    • PERSISTENT
    • PERSISTENT_SEQUENTIAL
    • EPHEMERAL
    • EPHEMERAL_SEQUENTIAL
  • 如果要创建SEQUENTIAL类型的节点,那么先生成一个顺序的路径名
  • 创建一个代表此次操作的CreateTxn

我们可以看到,上面只是创建了ChangeRecord以及CreateTxn,而并没有把它进行持久化,或者应用到DataTree中.

这是为什么呢?

因为这只是PreRequestProcessor中进行的操作,后面还有好几个RequestProcessor等着进行操作呢.

要将ChangeRecord应用到DataTree,我们首先需要Leader根据Zab算法确定此次操作能够被多半Follower知道吧.

所以这里才不会应用到DataTree

另外,上面代码中的还涉及到了ACL.

ZooKeeper中内置了下面几种ACL permission以及Schema:

经过PreRequestProcessor的处理之后,只是进行了第一步的处理,后面还有其他的处理.

我们从LeaderZooKeeperServersetupRequestProcessor()方法中,可以看到,它设置了好几个RequestProcessor,来对请求进行一系列的处理.

我们可以看到,LeaderZooKeeperServer就设置了这么几个RequestProcessor: PreRequestProcessor -> ProposalRequestProcessor -> CommitProcessor -> ToBeAppliedRequestProcessor -> FinalRequestProcessor

其处理过程如下:

  • 对请求进行预处理
  • 通过Zab算法确定能够提交
  • 如果收到了半数Follower的同意,则提交Proposal
  • 应用到DataTree
  • 给客户端一个回复

基本上一个请求的处理就是这样,其它的我也没有细看,应该都差不多.请读者自行阅读源码来了解其他请求的处理过程.