Storm學習筆記 消息容錯機制 文章來自「隨筆」 http://jsynk.cn/blog/articles/153.html 1. Storm消息容錯機制概念 一個提供了可靠的處理機制的spout需要記錄自己emit(發射)的tuple(消息元祖),當下游bolt處理tuple或者子tuple失 ...
Storm學習筆記 - 消息容錯機制
1. Storm消息容錯機制概念
- 一個提供了可靠的處理機制的spout需要記錄自己emit(發射)的tuple(消息元祖),當下游bolt處理tuple或者子tuple失敗時spout能夠重新發射。
- Storm通過調用Spout的nextTuple()發送一個tuple。為實現可靠的消息處理,首先要給每個發出的tuple帶上唯一的ID,並且將ID作為參數傳遞給SoputOutputCollector的emit()方法:collector.emit(new Values("value1","value2"), msgId);
無論處理成功還是失敗,spout都要接收tuple樹上所有節點返回的通知。如果處理成功,spout的ack()方法將會對編號是msgId的消息應答確認;如果處理失敗或者超時,會調用fail()方法。
2. 基本實現
- Storm 系統中有一組叫做"acker"的特殊任務,它們負責跟蹤DAG(有向無環圖)中的每個消息。
- acker任務保存了spout id到一對值的映射。第一個值就是spout的任務id,通過這個id,acker就知道消息處理完成時該通知哪個spout任務。第二個值是一個64bit的數字,我們稱之為"ack val", 它是樹中所有消息的隨機id的異或計算結果。
ack val表示了整棵樹的的狀態,無論這棵樹多大,只需要這個固定大小的數字就可以跟蹤整棵樹。當消息被創建和被應答的時候都會有相同的消息id發送過來做異或。 每當acker發現一棵樹的ack val值為0的時候,它就知道這棵樹已經被完全處理了
3. 案例
看一個簡單的示例:spout或bolt處理完tuple後都會生成一個值(示例只使用8位),同一個ROOTID的值都會做異或,如果最終結果是0則處理過程沒有出錯。