带着问题撸源码系列-zookeeper-不同的RequestProcessor之间是什么关系,如何协调?

问题

带着问题撸源码系列-zookeeper-不同的RequestProcessor之间是什么关系,如何协调?

参考

思考了颇久实在没找到突破的方法,只好找网上文章找突破口了:
处理写请求过程

读源码

在这里配置每个RequestProcessor的关系,先调用哪个再调用哪个:
org.apache.zookeeper.server.quorum.FollowerZooKeeperServer#setupRequestProcessors
可以看到是
带着问题撸源码系列-zookeeper-不同的RequestProcessor之间是什么关系,如何协调?
可以看到,第一个是FollowerRequestProcessor,紧接着是commitProcessor,最后是FinalRequestProcessor

这个就有点像责任链模式,让每个模块都有处理事情的机会,GOT IT!
带着问题撸源码系列-zookeeper-不同的RequestProcessor之间是什么关系,如何协调?

每个RequestProcessor都会在调用过程中,调用下一个Processor,让下一个Processor完成他的任务,如在FollowerRequestProcessor中:
带着问题撸源码系列-zookeeper-不同的RequestProcessor之间是什么关系,如何协调?

断点调试

我们在FollowerRequestProcessor中打断点条件断点:request.type!=11,同时在下一个Processor:commitProcessor中也打断点,然后我们来发一个读请求:ls /

可以看到确实是先在
FollowerRequestProcessor停住了
然后在commitProcessor停住了

回答问题

setUp的时候,指定了每个Processor的下一个Processor是谁,然后在每个Processor处理的过程中会调用自己的nextProcessor来处理,以一个责任链的模式将Request传递。
具体到Follower的责任链,是 FollowerRequestProcessor -》 commitProcessor -》 FinalRequestProcesoor