1. 程式人生 > >Storm學習筆記 - 訊息容錯機制

Storm學習筆記 - 訊息容錯機制

Storm學習筆記 - 訊息容錯機制

文章來自「隨筆」 http://jsynk.cn/blog/articles/153.html

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則處理過程沒有出錯。