我有帶嘴S上拓撲的一個,和3個螺栓處理中失敗()的情況下,引起風暴的重賽事件的重複 - A,B,C如何從螺栓
螺栓從讀Spout S. Bolt A然後將數據分成螺栓B和C(基於某個過濾器)。螺栓B和C有它們各自的數據匯。
如果我使用Storm的錨定並將錨定在螺栓A上,然後在Bolt B ack上成功執行,但螺栓C執行失敗()。在Spout S的風暴重放是否會導致Bolt B發生重複事件並進入B的數據接收器?
如果是這樣,在仍然使用風暴錨定的可靠性特徵的同時避免這種情況的方法是什麼?
我有帶嘴S上拓撲的一個,和3個螺栓處理中失敗()的情況下,引起風暴的重賽事件的重複 - A,B,C如何從螺栓
螺栓從讀Spout S. Bolt A然後將數據分成螺栓B和C(基於某個過濾器)。螺栓B和C有它們各自的數據匯。
如果我使用Storm的錨定並將錨定在螺栓A上,然後在Bolt B ack上成功執行,但螺栓C執行失敗()。在Spout S的風暴重放是否會導致Bolt B發生重複事件並進入B的數據接收器?
如果是這樣,在仍然使用風暴錨定的可靠性特徵的同時避免這種情況的方法是什麼?
Storm的錨定功能只支持至少一次處理,並且在出現故障時不支持處理重複項。根據你的應用語義,這可能是一個問題或不是。
例如,如果稍後進行冪等操作時,重複不是問題(冪等操作的一個示例是更新鍵值存儲 - 如果由於重複而導致兩個put
操作,則鍵的狀態價值商店仍然是一樣的)。
如果您有非冪等操作並且重複是一個問題,那麼您可以嘗試關注這是否由您擁有 - 但這很難正確。
作爲一種替代方案,您可以使用Trident API而不是低級API,它只提供一次保證。
或者,作爲最後的手段,使用一種不同的系統,它確實提供了剛好一次性的開箱即用語義。
謝謝@Matthias。一旦錨定了元組,默認情況下是Storm中的重放機制?或者你必須通過覆蓋ack()和fail()方法來自己編寫代碼嗎? – figaro
如果您實現自己的噴口,則需要實現ack()和fail()。 (Storm已經提供了一些所謂的「可靠的噴口」,你可以直接使用)當然,你還需要確保你的噴口本身是容錯的,並且可以重新發射元組如果fail()被調用,即使噴口本身在兩者之間失敗。此外,在噴嘴內調用發射時,您需要分配消息ID。 –