2017-06-19 64 views
0

因此,Apache Storm + Trident提供了完全一次的語義。想象我有以下拓撲:在存儲器風暴三叉戟在網絡分區和/或故障場景中的確切一次保證

TridentSpout -> SumMoneyBolt -> SaveMoneyBolt -> Persistent Storage. 

CalculateMoneyBolt總和的貨幣值,然後將結果傳遞給SaveMoneyBolt應的最終值保存到遠程存儲/數據庫。

現在,我們計算這些值並僅存儲一次數據庫非常重要。我們不希望意外地重複計算這筆錢。

那麼Storm with Trident如何在成功發送對數據庫的寫入請求時處理網絡分區和/或故障場景,數據庫已成功接收請求,記錄事務,並在響應客戶端時SaveMoneyBolt在收到數據庫響應之前已經死亡或從網絡中分區了嗎?

我認爲如果SaveMoneyBolt已經死亡,Trident會重試批次,但我們不能重複計算。

這樣的場景是如何處理的?

謝謝。

回答

1

Trident爲每個批次提供了唯一的事務ID。如果批次重試,它將具有相同的txid。批量更新也是有序的,即,直到前一批次的更新完成後,批次的狀態更新纔會發生。因此,通過將txid與狀態中的值一起存儲起來,可以消除重複更新並只提供一次語義。

Trident帶有幾個內置的Map狀態實現,它們自動處理所有這些。

欲瞭解更多信息,看看文檔: