标题: zookeeper原理解析-服务器端处理流程(2) [打印本页]
作者: look_w 时间: 2018-12-18 20:52 标题: 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的同步处理器流程
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |