在網上看到了很多有關於storm的資料,不過很多具體的問題還是沒有解答。
本文的主要內容主要是進行storm中ack和fail訊息的處理。
大家都知道,spout和bolt的實現需要繼承或者實現介面。對於spout來說,有兩個基類以供繼承:basebasicspout和baserichspout。兩個類的區別是:前者隱式的傳遞了ack和fail資訊,系統會自動傳遞,然後自動處理;而後者,需要我們手動的去呼叫ack和fail資訊,以供我們後續去自定義ack和fail的要響應的內容。
現在看到,若要實現手動的編寫ack及fail的響應方法,繼承上述的兩個基類均可以,但同時需要注意的必須要做的有兩點:
1,、需要在spout中覆寫ack及fail方法:如
/**
* 成功處理
*/public void ack(object msgid)
/*** 失敗處理
*/public void fail(object msgid)
2、需要在spout向後續的bolt發射tuple時,需要指定乙個messageid,如
values value=new values(list.get(j)));
_collector.emit(new values(value,value);//在這裡,messageid就是value本身
一般情況下,可以使用value本身作為這個messageid。這樣就將這個value和它的id進行了anchor.同時,在後續的bolt在接收這個tuple後,除了可以進行處理並向下傳送外,還需將這個tuple進行ack。也就如下:
//處理tuple,比如將tuple處理後的結果為data
values value=new values(data);
collector.emit(tuple,value);//tuple為本次execute方法接收的tuple,而value則是將tuple進行改變後生成的data值。這個過程就是進行anchor
collector.ack(tuple);//對tuple進行ack訊息回送
每當tuple向節點的子節點進行分發的時候,tuple所對應的messageid都會進行一定的異或運算。然後在最後樹結構完成後,異或的結果若是0,則說明處理過程是成功的,則呼叫ack方法;若超時,則呼叫fail方法。
Storm 中的ack機制
一.ack原理 storm中有個特殊的task名叫acker,他們負責跟蹤spout發出的每乙個tuple的tuple樹 因為乙個tuple通過spout發出了,經過每乙個bolt處理後,會生成乙個新的tuple傳送出去 當acker 框架自啟動的task 發現乙個tuple樹已經處理完成了,它會傳...
Storm的可靠性與ack機制
無論是實時處理還是離線處理,都會遇到乙個不可避免的問題是,失敗任務如何重做?storm提供了乙個ack機制。首先來看一下ispout介面的方法。public inte ce ispout extends serializable可以看到,提供了兩個方法ack 和fail 裡面的引數是乙個叫msgid...
TCP連線中的ACK與ack
在tcp協議三報文握手建立連線的過程中,tcp請求報文段中存在ack和ack兩個數值。要搞清楚這兩個數值的含義,得了解tcp報文段的首部格式 1 tcp報文段的首部格式 tcp報文段分為首部與資料部分兩大部分,首部存放tcp報文段相關資訊,資料部分存放tcp報文段資料內容。首部按順序存在20個固定位...