请求处理器是对处理流水线上不同阶段的抽象,
每一个服务器实现了一个请求处理器的序列,一个请求经过服务器上所有处理器的处理后得到了完全处理
RequestProcessor的接口,这个接口的主要方法是processRequest,接收一个Request请求,对相邻处理器请求通过队列实现解耦合
独立服务器
ZooKeeperServer类
PrepRequestProcessor
SyncRequestProcessor
FinalRequestProcessor
一个独立服务器的流水线
PrepRequestProcessor接受客户端的请求并执行这个请求,处理结果这生成一个事务,事务是执行一个操作的结果,该操作后反映到zookeeper的数据树上
事务信息将会以头部记录和事务记录的方式添加到Request对象中,只有改变zookeeper状态的操作才会产生事务,读操作并不会产生任何事务,因此,对于读请求的Request对象,事务的成员属性的引用值为null
下一个处理器为SyncRequestProcessor,负责将事务持久化到磁盘上,实际上就是将事务数据按顺序追加到事务日志中,并生成快照数据
最后一个处理器FinalRequestProcessor,如果Request对象包含事务数据如果request中包含事务数据,则处理器会接收修改zookeeper的修改
负责该处理器会从数据树读取数据并返回
群首服务器 LeaderZooKeeper 处理流水线
第一个仍然是PreRequestProcessor处理器,之后ProposalRequestProcessor,这个处理器会准备一个提议,并将提议发送到跟随者。ProposalRequestProcessor会将所有的提议发送给追随者CommitRequestProcessor,如果是写请求会发送给SyncRequestProcessor处理器
SyncRequestProcessor处理器要做的也是将事务持久化到硬盘,持久化之后会触发AckRequestProcessor
处理器,在zk集群模式中,要收到所有跟随者和自己对这个提议的确认,这个AckRequestProcessor处理器就是做确认处理的工作
ProposalRequestProcessor之后的处理器为CommitRequestProcessor,它会将收到确认消息的提议进行提交确认消息是由Leader.processAck()方法,这个方法会将提交的请求加入CommitRequestProcesspr类的一个队列中,这个队列会由请求处理器线程进行处理