首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

zookeeper原理解析-服务器端处理流程(2)

zookeeper原理解析-服务器端处理流程(2)

2)处理器详解
各个processor的主要功能
1) PrepRequestProcessor
         如名字这个处理器主要功能是对请求进行预处理, 将client向server请求二进制数据反序列化成sever中请求操作。

PrepRequestProcessor做为leader的第一个处理器,它的请求数据来源主要来自:
(1)    Leader做一个zk服务接收客户端请求提交到PrepRequestProcessor的队列中
(2)    作为集群的leader,在LearnerHanler.run方法中接收learner向leader发送的投票请求,消息类型为Leader.REQUEST

PrepRequestProcessor的处理流程:
(1)    对于非事物性请求:sync,exists, getData, getChildRen,ping, setWatches 这里只做session的检查看看是否超时
(2)    对于事务请求:create, delete,setData,setAcl,check,multi,根据请求的类型创建不同的操作如:type=create è CreateRequest, type=delete èDeleteRequest  等等
(3)    Zookeeper创建新的事务号zxid
(4)    创建并设置事务请求的消息头
(5)    反序列化网络client请求对象提取数据到事务对象的消息体中

PrepRequestProcessor线程 {

    run {

       1. submittedRequests.take()取出nio读取的请求

       2. 根据请求type构建对应的record对象,并将request中的ByteBuffer数据,反序列化到record中

       3. zks.getNextZxid() 生成一个新的事务号递增,作为zxid

       4. 根据cxid,zxid, sessionId等构建事务头TxnHeader

       5.1 对create/delete/setData/setACL/createSession/closeSession/check

               1)checkSession,检测是否过期

               2)创建对应的事务体CreateTxn/DeleteTxn等等

                 3)构建ChangeRecord加入到zks.outstandingChanges队列中去(FinalRequestProcessor会去处理,最终去改变数据)

       5.2 exists/getData 只是 checkSession

       6. 调下一个Processor

    }


processRequest() {

       //单机版被zookeeper调,将nio读取的请求加入到submittedRequests中

    }

}


2)ProposalRequestProcessor
         ProposalRequestProcessor的处理逻辑相对比较简单


(1)    转发到后面的处理器
(2)    如果是事务性请求(请求头存在的话),leader向follower发起操作请求,超过一半才算成功响应客户端
(3)    如果是事务性请求,调用leader的同步处理器流程
返回列表