1. 程式人生 > >storm ack機制流程詳解

storm ack機制流程詳解

  1. 第①步,spout發出一個tuple給下游,生成root id、tuple id、taskid(標記spout的本次任務,使用者acker bolt通過emitDirect方式傳送ack結果時使用,假設為222)。此時傳送給acker bolt的ack訊息為<root id = 111,ack value = 1,task id = 222>,acker bolt中記錄的ack資訊為<root id = 111,ack value = 1>
  2. 第②步split bolt接收到句子後,切割出三個單詞,傳送三個tuple。三個tuple傳送完成後,呼叫ack函式,ack val = (輸入tuple id) ^ (所有輸出tuple id的異或結果)。則傳送給acker bolt的ack訊息為<root id = 111,ack value = 1 ^ 2 ^ 3 ^ 4>,acker bolt中記錄的ack資訊更新為<root id = 111,ack value = 1 ^ (1 ^ 2 ^ 3 ^ 4)>
  3. 第③④⑤步,實際上沒有先後順序,與第②步類似,每一個bolt分別輸出的ack訊息分別是<root id = 111,ack value = 2 ^ 5>、<root id = 111,ack value = 3 ^ 6>、<root id = 111,ack value = 4 ^ 7>,acker bolt中記錄的ack資訊更新為為<root id = 111,ack value = 1 ^ (1 ^ 2 ^ 3 ^ 4) ^ (2 ^ 5) ^ (3 ^ 6) ^ (4 ^ 7)>
  4. 第⑥步,report bolt沒有輸出,其ack val = (輸入tuple id)。則當count bolt的三個tuple都到達並處理完成時,會向acker bolt傳送三次訊息,三次的ack訊息分別為<root id = 111,ack value = 5>、<root id = 111,ack value = 6>、<root id = 111,ack value = 7>,acker bolt中記錄的ack資訊更新為<root id = 111,ack value = 1 ^ (1 ^ 2 ^ 3 ^ 4) ^ (2 ^ 5) ^ (3 ^ 6) ^ (4 ^ 7) ^ 5 ^ 6 ^ 7> = <root id = 111, ack value = 0>
  5. 第⑦步,acker bolt檢測到ack value為0,ack bolt通過其對應的root id拿到對應的spout task id(222),通過emitDirect方式將ack的訊息傳送給對應的spout task。從而完成整個訊息流的處理。