Zookeeper 事务请求

5. 事务请求

下面将介绍在Zookeeper中,一次事务请求的整个过程。对于非事务请求,其处理过程比较简单,则不进行介绍。对于客户端来说,其过程是一样的,客户端将请求包装进队列中,然后发往服务端。所以这里的重点是分析服务端的处理过程:
每个Client一般都是和一个Server保持长连,Server 一般是 FollowerObserver。当Leader配置了leaderServes=true,则客户端也可以连接到Leader

Server 接收到请求后,会间接交给ZookeeperServer处理,为了将整个过程都涵盖到,因此下面假定Client连接的是Follower,并向Follwer发送 createNode 的请求。

下图是事务请求的整个过程:

整体流程如下:

  1. FollowerRequestProcessor 接收到Client的请求后,会将请求交给 CommitRequestProcessor,其会判断请求是否要提交:如果需要则将请求放进针对每个sessionId区分的 pendingRequests 中等待commit
  2. 在将请求提交给 CommitRequestProcessor 后,FollowerRequestProcessor 会将事务请求通过之前与Leader建立的连接 交给Leader
  3. Leader 在接收到请求后,交给 PrepRequestProcessor 进行处理,其会在ZKoutstandingChangesoutstandingCHangesForPath 里添加一条更改记录ChangeRecord。其后将请求交给 ProposalRequestProcessor 进行处理;
  4. ProposalRequestProcessor首先将请求提交给下一个处理器CommitRequestProcessor,然后调用 Leader.propose 来发起事务提议,也即是给每个与自己相连的Follower发从事务提议 Proposal。完成发送后调用 SyncRequestProcessor 添加事务记录,再将请求发送给AckRequestProcessor,其向Leader做出Ack应答;
  5. Follower接收到来自Leader的提议后,交给SyncRequestProcessor添加事务记录,再将请求传递给下一个处理器SendAckRequestProcessor,其则向Leader返回ACK消息;
  6. Leader收到ACK信息后,会执行Leader.processAck方法,首先会取出之前提交的Proposal,然后进行判断是否有超过一半的Follower返回了ACK,若是则将Proposal放进 toBeApplied 队列中,并向所有Follower发送 COMMIT提交事务(若提交的事务与本地不一致则系统会停机),向Observer发送 INFORM 并带上数据。最后执行CommitRequestProcessor.commit进行本地提交,本地提交最后执行的是Leader.processRequest方法,其将请求最终交给FinalRequestProcessor进行处理;
  7. FinalRequestProcessor则将事务请求应用到内存数据库中,并做一些收尾工作;
  8. Follower收到事务的COMMIT消息,提交事务,执行CommitRequestProcessor.commit将事务变更应用到内存数据库中。
您的支持是我创作源源不断的动力