storm的acker機制理解


轉載請注明原創地址http://www.cnblogs.com/dongxiao-yang/p/6142356.html

      Storm 的拓撲有一些特殊的稱為“acker”的任務,這些任務負責跟蹤每個 Spout 發出的 tuple 的 DAG。開啟storm tracker機制的前提有三個:

1. 在spout emit tuple的時候,要加上第3個參數messageid 
2. 在配置中acker數目至少為1 
3. 在bolt emit的時候,要加上第二個參數anchor tuple,以保持tracker鏈路。

     當一個 tuple 在拓撲中被創建出來的時候, 不管是在 Spout 中還是在 Bolt 中創建的 , 這個 tuple 都會被配置一個隨機的 64 位 id。acker 就是使用這些 id 來跟蹤每個 spout tuple 的 tuple DAG。這里貼一下storm源碼分析里一個ack機制的例子。

  

 

 

理解下整個大體節奏分為幾部分 

步驟1和2 spout把一條信息同時發送給了bolt1和bolt2,步驟3表示spout emit成功后去 acker bolt里注冊本次根消息,ack值設定為本次發送的消息對應的64位id的異或運算值,上圖對應的是T1^T2

步驟4表示bolt1收到T1后,單條tuple被拆成了三條消息T3T4T5發送給bolt3。步驟6 bolt1在ack()方法調用時會向acker bolt提交T1^T3^T4^T5的ack值。

步驟5和7的bolt都沒有產生新消息,所以ack()的時候分別向acker bolt提交了T2T3^T4^T5的ack值。

綜上所述,本次spout產生的tuple樹對應的ack值經過的運算為 T1^T2^T1^T3^T4^T5^T2^T3^T4^T5按照異或運算的規則,ack值最終正好歸零。

步驟8為acker bolt發現根spout最終對應的的ack是0以后認為所有衍生出來的數據都已經處理成功,它會通知對應的spout,spout會調用相應的ack方法。

 

storm這個機制的實現方式保證了無論一個tuple樹有多少個節點,一個根消息對應的追蹤ack值所占用的空間大小是固定的,極大地節約了內存空間。

 

參考文檔

Storm ack和fail機制再論

Storm應用系列之——可靠性與acker機制

3 《strom源碼分析》 第12章

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM