storm acker機制

首先來看一下什麼叫作記錄級容錯?storm容許用戶在spout中發射一個新的源tuple時爲其指定一個message id, 這個message id能夠是任意的object對象。多個源tuple能夠共用一個message id,表示這多個源 tuple對用戶來講是同一個消息單元。storm中記錄級容錯的意思是說,storm會告知用戶每個消息單元是否在指定時間內被徹底處理了。那什麼叫作徹底處理呢,就是該message id綁定的源tuple及由該源tuple後續生成的tuple通過了topology中每個應該到達的bolt的處理。舉個例子。在圖4-1中,在spout由message 1綁定的tuple1和tuple2通過了bolt1和bolt2的處理生成兩個新的tuple,並最終都流向了bolt3。當這個過程完成處理完時,稱message 1被徹底處理了。web

 

在storm的topology中有一個系統級組件,叫作acker。這個acker的任務就是追蹤從spout中流出來的每個message id綁定的若干tuple的處理路徑,若是在用戶設置的最大超時時間內這些tuple沒有被徹底處理,那麼acker就會告知spout該消息處理失敗了,相反則會告知spout該消息處理成功了。在剛纔的描述中,咱們提到了」記錄tuple的處理路徑」,若是曾經嘗試過這麼作的同窗能夠仔細地思考一下這件事的複雜程度。可是storm中倒是使用了一種很是巧妙的方法作到了。在說明這個方法以前,咱們來複習一個數學定理。spa

A xor A = 0.orm

A xor B…xor B xor A = 0,其中每個操做數出現且僅出現兩次。對象

storm中使用的巧妙方法就是基於這個定理。具體過程是這樣的:在spout中系統會爲用戶指定的message id生成一個對應的64位整數,做爲一個root id。root id會傳遞給acker及後續的bolt做爲該消息單元的惟一標識。同時不管是spout仍是bolt每次新生成一個tuple的時候,都會賦予該tuple一個64位的整數的id。Spout發射完某個message id對應的源tuple以後,會告知acker本身發射的root id及生成的那些源tuple的id。而bolt呢,每次接受到一個輸入tuple處理完以後,也會告知acker本身處理的輸入tuple的id及新生成的那些tuple的id。Acker只須要對這些id作一個簡單的異或運算,就能判斷出該root id對應的消息單元是否處理完成了。下面經過一個圖示來講明這個過程。數學

spout中綁定message 1生成了兩個源tuple,id分別是0010和1011.it

bolt1處理tuple 0010時生成了一個新的tuple,id爲0110.import

 bolt2處理tuple 1011時生成了一個新的tuple,id爲0111.object

 

bolt3中接收到tuple 0110和tuple 0111,沒有生成新的tuple.webkit

可能有些細心的同窗會發現,容錯過程存在一個可能出錯的地方,那就是,若是生成的tuple id並非徹底各異的,acker可能會在消息單元徹底處理完成以前就錯誤的計算爲0。這個錯誤在理論上的確是存在的,可是在實際中其機率是極低極低的,徹底能夠忽略。方法

相關文章
相關標籤/搜索