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请求处理链概述的主要内容,如果未能解决你的问题,请参考以下文章

ZK集群如何保证数据一致性源码阅读

Android 进阶之探索 OkHttp 原理

zookeeper介绍

Dubbo入门以及总结

设计模式之责任链模式

责任链模式