1、storm的可靠性服務器
storm保證從spout發出的每一個tuple都會被徹底處理 便可靠性spa
Acker工做流程線程
1 Spout 建立一個新的Tuple時候,會發射一個消息通知acker去跟蹤;code
collector.emit( new Values("value1" , "value2") , msgId );orm
2 Bolt 在處理Tuple成功或者失敗,也會發送一個消息通知Acker隊列
collector.emit( tuple, new Values( word));進程
3 Acker會找到發射該Tuple的Spout,回調其Ack ,fail方法unicode
發射tuple的時候spout會提供一個message-id, 後面咱們經過這個message-id來追蹤這個tuple。開發
IBasicBolt類會自動調用ack/fail方法,而IRichBolt則須要咱們手動調用ack/fail方法。消息隊列
三種方法能夠去掉可靠性
第一是把Config.TOPOLOGY_ACKERS 設置成 0. 在這種狀況下,storm會在spout發射一個tuple以後立刻調用spout的ack方法。也就是說這個tuple樹不會被跟蹤。
第二個方法是在tuple層面去掉可靠性。 你能夠在發射tuple的時候不指定messageid來達到不跟糉某個特定的spout tuple的目的。
最後一個方法是若是你對於一個tuple樹裏面的某一部分到底成不成功不是很關心,那麼能夠在發射這些tuple的時候unanchor它們。 這樣這些tuple就不在tuple樹裏面, 也就不會被跟蹤了。
6. 快速的消息處理
用ZeroMQ做爲底層消息隊列, 保證消息能快速被處理
支持水平擴展
在Storm集羣中真正運行topology的主要有三個實體:工做進程、線程和任務。Storm集羣中的每臺機器上均可以運行多個工做進程,每一個工做進程又可建立多個線程,每一個線程能夠執行多個任務,任務是真正進行數據處理的實體,咱們開發的spout、bolt就是做爲一個或者多個任務的方式執行的。
所以,計算任務在多個線程、進程和服務器之間並行進行,支持靈活的水平擴展。
4. 容錯性強
若是在消息處理過程當中出了一些異常,Storm會從新安排這個出問題的處理單元。Storm保證一個處理單元永遠運行(除非你顯式殺掉這個處理單元)。
5. 可靠的消息保證
Storm能夠保證spout發出的每條消息都能被「徹底處理」,這也是直接區別於其餘實時系統的地方,