Zookeeper -- 消息處理鏈

對(duì)于客戶端消息普办,zk創(chuàng)建了一系列的RequestProcessor來(lái)對(duì)消息進(jìn)行鏈?zhǔn)教幚砥痰小k服務(wù)承擔(dān)不同角色時(shí)兼蜈,消息處理鏈?zhǔn)遣煌摹?/p>

一历等、Standalone

PrepRequestProcessor ->SyncRequestProcessor ->FinalRequestProcessor

PrepRequestProcessor:

主要工作是做check,并在請(qǐng)求中填充一些必須的數(shù)據(jù):

  • 校驗(yàn)session是否合法,檢查是否有acl權(quán)限,對(duì)于創(chuàng)建目錄的請(qǐng)求,檢查父節(jié)點(diǎn)是否是臨時(shí)節(jié)點(diǎn)等氏身。巍棱。

  • 對(duì)于寫操作,給請(qǐng)求附加上TxnHeader(帶請(qǐng)求時(shí)間蛋欣,zxid等)航徙。

...

SyncRequestProcessor

邏輯比較多,如在PrepRequestProcessor所說(shuō)的,對(duì)于會(huì)改變數(shù)據(jù)內(nèi)容的請(qǐng)求或者事務(wù)請(qǐng)求陷虎,zk會(huì)在request頭部增加一個(gè)TxnHeader到踏。

1.對(duì)于帶TxnHeader的消息,會(huì)附加到日志中尚猿,并增加到SyncRequestProcessor#toFlush隊(duì)列中窝稿,當(dāng)toFlush超限,或者從上游RequestProcessor中獲取不到新的消息時(shí)谊路,開始做flush讹躯。
flush:
將日志整體flush到磁盤
逐一將消息轉(zhuǎn)給下個(gè)RequestProcessor

2.對(duì)于存粹的讀請(qǐng)求菩彬,可以直接放行給下個(gè)RequestProcessor缠劝,但是有要求,toFlush需要是空的骗灶,這個(gè)比較好理解惨恭,如果toFlush不為空,那么可能之前有寫操作改變數(shù)據(jù)庫(kù)內(nèi)容耙旦,導(dǎo)致臟讀脱羡。

3.當(dāng)日志數(shù)量超過(guò)一個(gè)隨機(jī)值,(用隨機(jī)值的目的是為了讓zk集群不同時(shí)dump快照)免都,創(chuàng)建一個(gè)線程固化一個(gè)快照到磁盤锉罐。

FinalRequestProcessor

這是最后一步了,主要操作就是對(duì)zk數(shù)據(jù)庫(kù)的增刪改查绕娘。注意到脓规,單機(jī)系統(tǒng)中,可以直接改险领,但是在集群中侨舆,leader需要等過(guò)半節(jié)點(diǎn)確認(rèn)過(guò)了之后才可以修改。同時(shí)附加下面兩部操作:

1.維護(hù)一個(gè)內(nèi)存日志隊(duì)列绢陌,作用是便于leader給掉線不久的節(jié)點(diǎn)同步DIFF數(shù)據(jù)挨下。
2.組裝response報(bào)文返回給客戶端

二、Leader

LeaderRequestProcessor->PrepRequestProcessor ->ProposalRequestProcessor -> CommitProcessor-> Leader.ToBeAppliedRequestProcessor ->FinalRequestProcessor

ProposalRequestProcessor

提交議案的處理器脐湾,主要是針對(duì)寫請(qǐng)求;對(duì)于寫操作臭笆,將這個(gè)請(qǐng)求廣播給所有follower。
同時(shí)ProposalRequestProcessor內(nèi)部有一個(gè)SyncRequestProcessor->AckRequestProcessor處理鏈,處理follower的回復(fù)愁铺,當(dāng)ack過(guò)半時(shí)凿菩,commit這次request,CommitProcessor才會(huì)繼續(xù)執(zhí)行帜讲。

CommitProcessor

顧名思義衅谷,這個(gè)處理器時(shí)處理需要決議的請(qǐng)求內(nèi)容,對(duì)于讀請(qǐng)求直接放行似将。其內(nèi)部有3個(gè)隊(duì)列:

CommitProcessor#queuedRequests
消息隊(duì)列获黔,存放所有從ProposalRequestProcessor到達(dá)的消息。

CommitProcessor#pendingRequests

等待隊(duì)列在验,CommitProcessor#queuedRequests中的請(qǐng)求分為兩類玷氏,讀請(qǐng)求直接放行,寫請(qǐng)求會(huì)放到這個(gè)隊(duì)列中去腋舌。

CommitProcessor#committedRequests

存放已提交的消息盏触,和上文中的ProposalRequestProcessor聯(lián)系起來(lái),當(dāng)收到過(guò)半follower的ack回復(fù)時(shí)块饺,會(huì)有如下的函數(shù)調(diào)用發(fā)生:AckRequestProcessor#processRequest->Leader#tryToCommit->CommitProcessor#commit.

Leader.ToBeAppliedRequestProcessor

代碼很簡(jiǎn)單赞辩,就是把CommitProcessor已確認(rèn)的消息清除了,不太明白有什么作用授艰,可能就是做個(gè)記錄辨嗽。

三、Follower

Follower在確定了自己為follower之后淮腾,會(huì)從leader處同步log(全量的情況是snapshot)糟需,同步完成以后,再啟動(dòng)下面的處理器鏈:

FollowerRequestProcessor->CommitProcessor->FinalRequestProcessor

FollowerRequestProcessor

主要任務(wù)就是調(diào)用Learner#request將寫請(qǐng)求轉(zhuǎn)發(fā)給leader

四谷朝、實(shí)例舉例

假設(shè)有一條客戶端的寫請(qǐng)求發(fā)給了Follower節(jié)點(diǎn)A洲押。 A會(huì)在FollowerRequestProcessor#run中將請(qǐng)求發(fā)給leader,Leader接收到這條寫請(qǐng)求圆凰,在ProposalRequestProcessor中將消息進(jìn)行廣播杈帐,follower節(jié)點(diǎn)收到消息以后,在選舉線程調(diào)用FollowerZooKeeperServer#logRequest將日志寫到本地送朱,然后SyncRequestProcessor對(duì)日志進(jìn)行提交后通過(guò)下個(gè)處理器SendAckRequestProcessor給leader返回ack娘荡。

leader收到過(guò)半回復(fù),對(duì)這條日志進(jìn)行提交固化到磁盤驶沼。同時(shí)同步給follower們炮沐,過(guò)程如下:產(chǎn)生一條攜帶原始zxid的Leader.COMMIT類型的消息,先放入LearnerHandler#queuedPackets(每個(gè)follower均會(huì)有一個(gè)LearnerHandler實(shí)例對(duì)接),LearnerHandler#run將隊(duì)列中的記錄發(fā)給follower.

follower對(duì)消息進(jìn)行提交回怜,存放到CommitProcessor#committedRequests大年,接著follower的處理鏈CommitProcessor調(diào)用下個(gè)處理器將消息存入zkdb中换薄,最后返回給客戶端結(jié)果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翔试,一起剝皮案震驚了整個(gè)濱河市轻要,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垦缅,老刑警劉巖冲泥,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異壁涎,居然都是意外死亡凡恍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門怔球,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嚼酝,“玉大人,你說(shuō)我怎么就攤上這事竟坛∶龉” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵担汤,是天一觀的道長(zhǎng)涎跨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)漫试,這世上最難降的妖魔是什么六敬? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮驾荣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘普泡。我一直安慰自己播掷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布撼班。 她就那樣靜靜地躺著歧匈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砰嘁。 梳的紋絲不亂的頭發(fā)上件炉,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音矮湘,去河邊找鬼斟冕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缅阳,可吹牛的內(nèi)容都是我干的磕蛇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秀撇!你這毒婦竟也來(lái)了超棺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呵燕,失蹤者是張志新(化名)和其女友劉穎棠绘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體再扭,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弄唧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霍衫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片候引。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敦跌,靈堂內(nèi)的尸體忽然破棺而出澄干,到底是詐尸還是另有隱情,我是刑警寧澤柠傍,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布麸俘,位于F島的核電站,受9級(jí)特大地震影響惧笛,放射性物質(zhì)發(fā)生泄漏从媚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一患整、第九天 我趴在偏房一處隱蔽的房頂上張望拜效。 院中可真熱鬧,春花似錦各谚、人聲如沸紧憾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赴穗。三九已至,卻和暖如春膀息,著一層夾襖步出監(jiān)牢的瞬間般眉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工潜支, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸赃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓毁腿,卻偏偏與公主長(zhǎng)得像辑奈,于是被迫代替她去往敵國(guó)和親苛茂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345