https://github.com/alibaba/jstorm/wiki/%E4%BA%8B%E5%8A%A1
storm的事務(wù)主要用于對數(shù)據(jù)準(zhǔn)確性要求非常高的環(huán)境中脓魏,尤其是在計算交易金額或筆數(shù),數(shù)據(jù)庫同步的場景中近她。
storm 事務(wù)邏輯是挺復(fù)雜的醋界,而且坦白講竟宋,代碼寫的挺爛的。 JStorm下一步將重新設(shè)計基于Meta 1 和Meta3 的事務(wù)模型形纺,讓使用者更簡便丘侠,代碼更清晰。
源碼可以參考 jstorm-example
Storm 事務(wù)的核心設(shè)計思想:
Transaction 還是基于基本的屬性之上逐样,做的一層封裝蜗字,從而滿足transaction ##核心設(shè)計1 提供一個strong order打肝,也就是,如果一個tuple沒有被完整的處理完挪捕,就不會處理下一個tuple粗梭,說簡單一些,就是级零,采用同步方式断医。并對每一個tuple賦予一個transaction ID,這個transaction ID是遞增屬性(強(qiáng)順序性)奏纪,如果每個bolt在處理tuple時鉴嗤,記錄了上次的tupleID,這樣即使在failure replay時能保證處理僅且處理一次 ##核心設(shè)計2 如果一次處理一個tuple序调,性能不夠好醉锅,可以考慮,一次處理一批(batch tuples) 這個時候发绢,一個batch為一個transaction處理單元硬耍,當(dāng)一個batch處理完畢,才能處理下一個batch边酒,每個batch賦予一個transaction ID默垄。 ##核心思想3 如果在計算任務(wù)中,并不是所有步驟需要強(qiáng)順序性甚纲,因此將一個計算任務(wù)拆分為2個階段:
processing 階段:這個階段可以并發(fā)
commit階段:這個階段必須強(qiáng)順序性,因此朦前,一個時刻介杆,只要一個batch在被處理 任何一個階段發(fā)生錯誤,都會完整重發(fā)batch
[
](https://github.com/alibaba/jstorm/wiki/%E4%BA%8B%E5%8A%A1#%E7%BB%93%E6%9E%9C)結(jié)果
一次性從Meta或Kafka 中取出一批數(shù)據(jù)韭寸,然后一條一條將數(shù)據(jù)發(fā)送出去春哨,當(dāng)所有數(shù)據(jù)均被正確處理后, 觸發(fā)一個commit 流恩伺,這個commit流是嚴(yán)格排序赴背,通常在commit流中進(jìn)行flush動作或刷數(shù)據(jù)庫動作,如果commit流最后返回也成功晶渠,spout 就更新Meta或kafka的偏移量凰荚,否則,任何一個環(huán)節(jié)出錯褒脯,都不會更新偏移量便瑟,也就最終重復(fù)消費(fèi)這批數(shù)據(jù)。
其實(shí)番川,相當(dāng)于把一個batch當(dāng)做一個原子tuple來處理到涂,只是中間計算的過程脊框,可以并發(fā)。