参考
总结
事件顺序:
- leader把proposal发给followers
- leader写日志, 并回复自己ack。followers开始写日志, 并回复leader ack
- leader收到过半ack后,异步向followers发送commit,并将事务应用到DataTree上
- followers收到commit后,将事务应用到DataTree上
LeaderZooKeeperServer启动CommitProcessor线程。后者对committed请求包装成CommitWorkRequest交给线程池执行。
ProposalRequestProcessor
生成事务发给所有follower
触发写日志操作
CommitProcessor
取出request并设置收集ACK
多个线程调用此处往前看
AckRequestProcessor之前是SyncRequestProcessor
SyncRequestProcessor.flush调用之 flush只有三处调用,第三处调用在shutdown方法
往后看
添加ACK,尝试提交没有过半ACK会提交失败
commit后
TryToCommit方法这里会判断ACK是否过半,未过半则失败,这里假设判断成功。
- 调用commit方法,异步发commit给所有成员
-
异步让commitProcessor确保日志写入
异步发commit给所有成员
commitProcessor取出
commitProcessor取出committedRequests异步交给下一个处理器Leader.ToBeAppliedRequestProcessor -> FinalRequestProcessor
网友评论