1. 程式人生 > >雲端計算、分散式架構、K8S、大資料、機器學習、搜尋、推薦、廣告

雲端計算、分散式架構、K8S、大資料、機器學習、搜尋、推薦、廣告

1、先看一下數學中的異或

    異或xor是一個數學運算子。它應用於邏輯運算。異或符號為“^”。

異或也叫半加運算,其運演算法則相當於不帶進位的二進位制加法:二進位制下用1表示真,0表示假,則異或的運演算法則為:0異或0=0,1異或0=1,0異或1=1,1異或1=0(同為0,異為1),

既然相同的物件XOR操作,結果是0,那麼有這樣一個公式,

A xor B…xor B xor A = 0,其中每一個操作數出現且僅出現兩次。

2、storm可靠性的機制

    storm中有一個系統級別的元件是acker,acker追蹤從spout發射出的流ID(msgId)在每一個task中生成的tuple是否完成。spout或者bolt在處理完tuple後,都會告訴acker我已經處理完了該源tuple(如tupleId=1),如果emit一個tuple的話,同時會告訴acker我發射了一個tuple(如tupleId=2),如果在大量的高併發的訊息的情況下,傳統的在記憶體中跟蹤執行情況的方式,記憶體的開銷會非常大,甚至記憶體溢位。acker巧妙的利用了xor的機制,只需要維護一個msgId的標記位即可,處理方法是acker在初始的時候,對每個msgId初始化一個校驗值ack-val(為0),在處理完tuple和emit tuple的時候,會先對這兩個個值做xor操作,生成的中間值再和acker中的當前校驗值ack-val做xor生成新的ack-val值,當所有的tuple都處理完成都得到確認,那麼最後的ack-val自然就為0了(因為每一個tuple,從emit到ack都是經過兩次xor操作,所以最後的結果為0可以由上面的那個公式可以驗證出來)。

   見下圖: