ZK请求处理链概述
Posted 奋斗吧_攻城狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZK请求处理链概述相关的知识,希望对你有一定的参考价值。
摘要
从这一节开始,讲解请求处理链相关内容,在集群版启动中,所处的位置如下图所示
使用责任链来处理每个客户端的请求时Zookeeper的特色
本节主要讲解
接口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表示关闭处理器,其意味着该处理器要关闭和其他处理器的连接
子类非常多,如下图
不同角色的请求处理链
leader
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的请求处理链会相对简单,其处理链如下
FollowerRequestProcessor
:其用作识别当前请求是否是事务请求,若是,那么Follower就会将该请求转发给Leader服务器,Leader服务器是在接收到这个事务请求后,就会将其提交到请求处理链,按照正常事务请求进行处理。SendAckRequestProcessor
:其承担了事务日志记录反馈的角色,在完成事务日志记录后,会向Leader服务器发送ACK消息以表明自身完成了事务日志的记录工作。
Observer
Observer充当观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器进行处理。Observer不会参与任何形式的投票,包括事务请求Proposal的投票和Leader选举投票。其处理链如下
思考
链式的体现
可以看子类源码,构造的时候,必须知道下一个处理器是什么
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请求处理链概述的主要内容,如果未能解决你的问题,请参考以下文章