2015-09-23 18 views
0

我正在嘗試一種方案,在該方案中,我有一個從Message Broker讀取數據並將消息作爲元組發送到螺栓進行某些處理的Spout。將元組發送到不同的螺栓

螺栓後處理將其轉換爲單獨的消息,並且每個子消息都必須發送到可託管在不同機器上的不同代理。

假設我有有限的收件人(在我的情況下有3個Message Brokers用於輸出)。

所以,Bolt1後處理可以直接刪除郵件給這3個消息代理現在

,如果我在這裏使用一個單一的博爾特這本身下降的消息,這三家券商和讓說,他們中的一個出現故障(由於不可用等),我稱之爲收集器的失敗方法。

一旦在螺栓上調用失敗方法,我的Spout失敗方法將被調用。

在這裏,我相信我將不得不再次處理整個消息(我必須確保每個消息都要被處理),即使3條消息中有2條被成功傳遞。

另外,即使我將這3個子消息發送到不同的螺栓,我認爲即使在這種情況下,Spout將不得不再次處理整個消息。

這是因爲我在噴嘴nextTuple()方法中第一次發出消息時追加了唯一Guid。

有沒有辦法確保只處理失敗的子消息而不是整個消息?

由於

回答

0

風暴(低電平的Java API)僅提供「一次刻錄至少-」處理的保證,即,沒有支持,以避免對故障的情況下重複處理。

如果您只需要一次操作,就可以在Storm上使用Trident。但是,如果您將數據發送到外部系統(如果外部系統無法檢測和刪除重複項),即使是Trident也不能給出一次。這不是暴風雨的具體問題,而是一般問題。像Apache Flink,Apache Spark Streaming或S-Store(麻省理工學院最近的一個研究原型系統 - Stonebraker)等其他系統也遭受同樣的問題。

也許最好的方法是嘗試三叉戟評估它是否能夠滿足您的要求。

相關問題