zookeeper原理解析-服务器端处理流程(2)
- UID
- 1066743
|
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的同步处理器流程 |
|
|
|
|
|