參考
總結(jié)
事件順序:
- leader把proposal發(fā)給followers
- leader寫日志, 并回復(fù)自己ack。followers開始寫日志, 并回復(fù)leader ack
- leader收到過(guò)半ack后,異步向followers發(fā)送commit,并將事務(wù)應(yīng)用到DataTree上
- followers收到commit后,將事務(wù)應(yīng)用到DataTree上
LeaderZooKeeperServer啟動(dòng)CommitProcessor線程。后者對(duì)committed請(qǐng)求包裝成CommitWorkRequest交給線程池執(zhí)行。
ProposalRequestProcessor


生成事務(wù)發(fā)給所有follower

觸發(fā)寫日志操作
CommitProcessor

取出request并設(shè)置
收集ACK

多個(gè)線程調(diào)用此處
往前看


AckRequestProcessor之前是SyncRequestProcessor

SyncRequestProcessor.flush調(diào)用之

flush只有三處調(diào)用,第三處調(diào)用在shutdown方法
往后看

添加ACK,嘗試提交

沒(méi)有過(guò)半ACK會(huì)提交失敗
commit后

TryToCommit方法
這里會(huì)判斷ACK是否過(guò)半,未過(guò)半則失敗,這里假設(shè)判斷成功。

- 調(diào)用commit方法,異步發(fā)commit給所有成員
-
異步讓commitProcessor確保日志寫入
異步發(fā)commit給所有成員
commitProcessor取出

commitProcessor

取出committedRequests異步交給下一個(gè)處理器Leader.ToBeAppliedRequestProcessor -> FinalRequestProcessor

