zk源码阅读44:请求处理链概述

摘要

从这一节开始,讲解请求处理链相关内容,在集群版启动中,所处的位置如下图所示
使用责任链来处理每个客户端的请求时Zookeeper的特色


zk源码阅读44:请求处理链概述_第1张图片
请求处理链在集群版zk启动所处的环节

本节主要讲解

接口RequestProcessor 以及实现类 
不同角色的请求处理链
  Leader下的请求处理链路,以及各个处理器的意义
  Follower下的请求处理链路,以及各个处理器的意义
  Observer下的请求处理链路,以及各个处理器的意义

接口RequestProcessor 以及实现类

RequestProcessor是所有处理器的父接口,其定义了处理器的处理方法
源码如下

public interface RequestProcessor {
    @SuppressWarnings("serial")
    public static class RequestProcessorException extends Exception {
        public RequestProcessorException(String msg, Throwable t) {
            super(msg, t);
        }
    }

    void processRequest(Request request) throws RequestProcessorException;

    void shutdown();
}

processRequest和shutdown方法则是核心方法,是子类必须要实现的方法,处理的主要逻辑在processRequest中,通过processRequest方法可以将请求传递到下个处理器,通常是单线程的。而shutdown表示关闭处理器,其意味着该处理器要关闭和其他处理器的连接

子类非常多,如下图

zk源码阅读44:请求处理链概述_第2张图片
RequestProcessor的实现类

不同角色的请求处理链

leader

Leader服务器的请求处理链如下

zk源码阅读44:请求处理链概述_第3张图片
leader请求处理链

PrepRequestProcessor。请求预处理器。在Zookeeper中,那些会改变服务器状态的请求称为事务请求(创建节点、更新数据、删除节点、创建会话等),PrepRequestProcessor能够识别出当前客户端请求是否是事务请求。对于事务请求,PrepRequestProcessor处理器会对其进行一系列预处理,如创建请求事务头、事务体、会话检查、ACL检查和版本检查等。

ProposalRequestProcessor。事务投票处理器。Leader服务器事务处理流程的发起者,对于非事务性请求,ProposalRequestProcessor会直接将请求转发到CommitProcessor处理器,不再做任何处理,而对于事务性请求,除了将请求转发到CommitProcessor外,还会根据请求类型创建对应的Proposal提议,并发送给所有的Follower服务器来发起一次集群内的事务投票。同时,ProposalRequestProcessor还会将事务请求交付给SyncRequestProcessor进行事务日志的记录。

SyncRequestProcessor。事务日志记录处理器。用来将事务请求记录到事务日志文件中,同时会触发Zookeeper进行数据快照。

AckRequestProcessor。负责在SyncRequestProcessor完成事务日志记录后,向Proposal的投票收集器发送ACK反馈,以通知投票收集器当前服务器已经完成了对该Proposal的事务日志记录。

CommitProcessor。事务提交处理器。对于非事务请求,该处理器会直接将其交付给下一级处理器处理;对于事务请求,其会等待集群内针对Proposal的投票直到该Proposal可被提交,利用CommitProcessor,每个服务器都可以很好地控制对事务请求的顺序处理。

ToBeAppliedRequestProcessor。该处理器有一个toBeApplied队列,用来存储那些已经被CommitProcessor处理过的可被提交的Proposal。其会将这些请求交付给FinalRequestProcessor处理器处理,待其处理完后,再将其从toBeApplied队列中移除。

FinalRequestProcessor。用来进行客户端请求返回之前的操作,包括创建客户端请求的响应,针对事务请求,该处理还会负责将事务应用到内存数据库中去。

Follower

Follower也采用了责任链模式组装的请求处理链来处理每一个客户端请求,由于不需要对事务请求的投票处理,因此Follower的请求处理链会相对简单,其处理链如下

zk源码阅读44:请求处理链概述_第4张图片
Follower请求处理链

FollowerRequestProcessor。其用作识别当前请求是否是事务请求,若是,那么Follower就会将该请求转发给Leader服务器,Leader服务器是在接收到这个事务请求后,就会将其提交到请求处理链,按照正常事务请求进行处理。

SendAckRequestProcessor。其承担了事务日志记录反馈的角色,在完成事务日志记录后,会向Leader服务器发送ACK消息以表明自身完成了事务日志的记录工作。

Observer

Observer充当观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器进行处理。Observer不会参与任何形式的投票,包括事务请求Proposal的投票和Leader选举投票。其处理链如下

zk源码阅读44:请求处理链概述_第5张图片
Observer请求处理链

思考

链式的体现

可以看子类源码,构造的时候,必须知道下一个处理器是什么
shutdown的时候,也要让下一个处理器shutdown

refer

http://www.cnblogs.com/leesf456/p/6139266.html
http://www.cnblogs.com/leesf456/p/6410793.html
http://blog.csdn.net/xhh198781/article/details/6587558 (多图)

你可能感兴趣的:(zk源码阅读44:请求处理链概述)