Storm【技術文檔】 - Storm的Acker機制


基本概念的解析分佈式

對於Storm,有一個相對比較重要的概念就是 "Guarantee no data loss" -- 可靠性spa

很明顯,要作到這個特性,必需要tracker 每個data的去向和結果,Storm是如何作到的orm

-》 那就是咱們接下來要說的 Acker 機制,先歸納下Acker所參與的工做流程生命週期


1 Spout 建立一個新的Tuple時候,會發射一個消息通知acker去跟蹤;文檔

2 Bolt 在處理Tuple成功或者失敗的時候,也會發送一個消息通知Acker工作流

3 Acker會好到發射該Tuple的Spout,回掉其Ack ,fail方法效率


一個tuple被徹底處理的意思是:
方法

這個tuple以及由這個tuple後續所致使的全部tuple 都被成功的處理, 而一個tuple會被認爲處理失敗了,若是這個im

消息在timeout所指定的時間內沒有成功處理top


也就是說對於任何一個Spout-tuple以及它的子孫,到底處理成功失敗與否,咱們都會獲得通知

由一個tuple產生一個新的tuple稱爲:anchoring,你發射一個tuple的同時也就完成了一次anchoring


Storm 裏面有一類特殊的task稱爲:acker,請注意,Acker也是屬於一種task,若是您對Task還不夠熟悉,請參考另外的一篇文檔:有關Storm-executor-task的關係,acker負責跟蹤spout發出的每個tuple的tuple樹,當Acker發現一個tuple樹已經處理完成了,它就會發送一個消息給產生這個tuple的task。


Acker task 組件來設置一個topology裏面的acker的數量,默認值是一,若是你的topoogy裏面的tuple比較多的話,那麼請把acker的數量設置多一點,效率會更高一點。


理解Storm的可靠性的辦法是看看 tuple,tuple樹的生命週期,當一個tuple被建立,無論是Spout 和bolt 建立的,他被賦予一個位的ID,而acker就是利用這個ID 去跟蹤全部的tuple的。每個tuple知他祖宗的iD,吐過Stomr檢測到一個tuple被徹底處理了,那麼Storm會以最開始的那個message-id 做爲參數去調用消息源頭的ACk方法,反之Storm會調用Spout的fail方法,


值得注意的一點是Storm調用Ack或則fail的task始終是產生這個tuple的那個task,因此若是一個Spout,被分爲不少個task來執行,消息執行的成功失敗與否始終會通知最開始發出tuple的那個task


Storm的可靠性產景

做爲Storm的使用者,有兩件事情要作以更好的利用Storm的可靠性特徵,首先你在生成一個tuple的時候要通知Storm,其次,徹底處理一個tuple以後要通知Storm,這樣Storm就能夠檢測到整個tuple樹有沒有完成處理,而且通知源Spout處理結果


1  因爲對應的task掛掉了,一個tuple沒有被Ack:

    Storm的超時機制在超時以後會把這個tuple標記爲失敗,從而能夠從新處理


2 Acker掛掉了: 在這種狀況下,由這個Acker所跟蹤的全部spout tuple都會出現超時,也會被從新的處理


3 Spout 掛掉了:在這種狀況下給Spout發送消息的消息源負責從新發送這些消息


三個基本的機制,保證了Storm的徹底分佈式,可伸縮的而且高度容錯的。

相關文章
相關標籤/搜索