美文网首页
责任链模式实践之Zookeeper责任链模式

责任链模式实践之Zookeeper责任链模式

作者: 鸿雁长飞鱼龙潜跃 | 来源:发表于2019-08-06 08:56 被阅读0次

    责任链模式实践之Zookeeper责任链模式

    一,责任链模式

    定义:责任链模式(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它。

    类型:行为类模式

    二,RequestProcessor接口

    RequestProcessor接口是Zookeeper责任链模式的接口,这个接口定义了2个方法:

    // 处理请求

    void processRequest(Request request);

    // 关闭请求,清空请求队列。

    void shutdown();

    三,LinkedBlockingQueue

    Zookeeper责任链模式使用阻塞队列LinkedBlockingQueue来保存请求。

    其实从这个角度来看的话,Zookeeper责任链模式采用了和消息队列类似的设计思路。责任链模式可以看做是一个微型的MQ。

    四,初始化Zookeeper责任链

    这里我们以单机版Zookeeper的启动为例来进行说明,集群版的没有找到初始化责任链的代码,有知道的,请不吝赐教。

    单机版启动的最后阶段,会创建ServerCnxnFactory,然后配置ServerCnxnFactory。

    this.cnxnFactory = ServerCnxnFactory.createFactory();

    this.cnxnFactory.configure(config.getClientPortAddress, config.getMaxClientCnxn());

    接着就会启动ServerCnxnFactory

    this.cnxnFactory.startup(zkServer);

    ServerCnxnFactory的具体实现有2个:

    NIOServerCnxnFactory

    NettyServerCnxnFactory

    这里以NIOServerCnxnFactory为例来说明:

    // 启动线程

    this.start();

    // 从ZKDatabase加载数据

    zks.startdata();

    // 启动ZookeeperServer

    zks.startup();

    初始化责任链的逻辑就在zks.startup()中,

    // 开启会话管理器

    this.startSessionTracker();

    // 初始化责任链

    this.setupRequestProcessors();

    // 注册JMX

    this.registerJMX();

    OK,接下来正式进入Zookeeper责任链模式的初始化。

    RequestProcessor finalProcessor = new FinalRequestProcessor(zookeeperServer);

    RequestProcessor syncProcessor = new SyncRequestProcessor(zookeeperServer, finalProcessor);

    synProcessor.start();

    // 设置第一个请求处理器

    this.firstProcessor = new PrepRequestProcessor(zookeeperServer, syncProcessor);

    this.firstProcessor.start();

    五,Zookeeper请求处理器

    1,PrepRequestProcessor

    PrepRequestProcessor是Zookeeper责任链的第一个请求处理器。PrepRequestProcessor首先会判断当前请求是否是事务请求,如果是事务请求,PrepRequestProcessor会对该请求进行一系列的预处理,比如创建请求事务头、事务体,会话检查,ACL检查,版本检查等等。

    Request类中定义了19种操作,有些请求是事务操作,有些请求不是事务操作。针对不同的操作,PrepRequestProcessor会执行相应的逻辑。

    2,ProposalRequestProcessor

    ProposalRequestProcessor处理器是Leader服务器的事务投票处理器,也是leader服务器事务处理流程的发起者。对于非事务请求,ProposalRequestProcessor会直接将请求流转到CommitRequestProcessor。对于事务请求,除了将请求交给CommitRequestProcessor外,还会根据请求类型创建对应的Proposal提议,并发送给所有的Follower服务器进行事务投票,并且还会把事务请求交给SyncRequestProcessor记录事务日志。

    3,SyncRequestProcessor

    SyncRequestProcessor的主要功能是记录事务日志和快照到ZKDatabase。

    4,AckRequestProcessor和SendAckRequestProcessor

    AckRequestProcessor是leader特有的处理器。AckRequestProcessor的主要功能是向Proposal的投票收集器发送ACK反馈,以通知投票收集器当前服务器已经完成了对该Proposal的事务日志记录。

    SendAckRequestProcessor是follower特有的处理器。SendAckRequestProcessor的主要功能是向Proposal的投票收集器发送ACK反馈,以通知投票收集器当前服务器已经完成了对该Proposal的事务日志记录。

    observer不参与投票。

    5,CommitRequestProcessor

    CommitRequestProcessor主要负责将已经完成本机submit的request和已经在集群中达成commit的request匹配,并将匹配后的request交给nextProcessor(即ToBeAppliedRequestProcessor)处理。

    6,ToBeAppliedRequestProcessor

    ToBeAppliedRequestProcessor是倒数第二个处理器,之后就是FinalRequestProcessor处理器。ToBeAppliedRequestProcessor处理器的功能是收集已经完成事务处理的请求,存入toBeApplied集合中,然后交给FinalRequestProcessor处理器。

    7,FinalRequestProcessor

    FinalRequestProcessor处理器是最后一个处理器。主要功能是做一些逻辑校验,然后封装响应信息返回客户端。

    相关文章

      网友评论

          本文标题:责任链模式实践之Zookeeper责任链模式

          本文链接:https://www.haomeiwen.com/subject/vbibdctx.html