(還有一些關於超時和maxSpoutPending的問題)風暴如何知道郵件何時「完全處理」?
我在Storm文檔中看到很多關於消息被完全處理的參考文獻。但是,我的KafkaSpout如何知道消息何時完全處理?
希望它能認識到我的螺栓連接的方式,所以當我的Stream中的最後一個螺栓夾住一個元組時,噴口知道我的消息何時處理?否則,我會想象在超時時間到期後,檢查消息的確認狀態,並且如果由確認/錨定XOR指示,則認爲它已被處理。但我希望事實並非如此?
我也有關於maxTuplesPending和超時配置的相關問題。
如果我將maxTuplePending設置爲10k,那麼我是否認爲每個spout實例都會繼續發射元組,直到spout實例正在跟蹤10k元組中的10k個元組,這些元組尚未完全處理?然後當一個正在處理的飛行消息被完全處理時,新的元組被髮射出去了嗎?
最後,這是否與超時配置有關?噴嘴在發出新消息之前是否以任何方式等待發生配置的超時?或者,如果消息處於停滯/緩慢狀態,超時配置才起作用,導致由於超時而失敗?
更簡潔(或希望更清楚),是否有一個效果來設置我的超時30分鐘除非消息不會失敗,除非他們在30分鐘內被最終的博爾特認可?或者是否還有其他影響,例如影響噴口排放速率的超時配置?
對不起,漫長而漫長的問題。預先感謝任何迴應。
*編輯進一步澄清
的原因,這對我來說是一個問題,是因爲我的消息並不一定要通過整個流運行。
說我有螺栓A,B,C,D。大多數時間的消息將從A-> B - > - > D傳遞。但是我有一些信息會故意停在螺栓A上.A會識別它們,但不會發出它們(因爲我的業務邏輯,在這種情況下,我希望進一步處理這些信息)。
那麼我的KafkaSpout是否知道被Ack發送但未從A發出的消息會被完全處理?因爲我希望在螺栓A完成之後馬上從噴口發出另一條消息,在這種情況下。
非常感謝您的詳細解答。你能解決我在編輯中提到的情況嗎?風暴如何知道「所有的賄賂都已收到」。如果我故意在A後插入A,但不要將元組發送到B,那麼這個消息是否會超時? – ab11
看看我的例子。元組「this」,「is」和「an」將被一箇中間螺栓過濾掉,即只有acked和沒有輸出。這工作得很好。如果一個句子中的所有單詞都會被過濾掉,那麼這棵樹就不那麼深了,但是初始句子對噴口來說會很好。 –
再次感謝。我仍然對Storm如何處理這個問題感到困惑。如果螺栓A調用ack並且不發射,Storm如何知道調用Spout.ack(messageId)?我認爲只有當Tuple樹中的最後一個螺栓確定了一個元組時,它纔會調用Spout.ack(messageId)(它怎麼知道在這種情況下,我沒有發出這個樹,比典型的深)。我問這是因爲即使我的拓撲在超時時間內完全處理了它的消息,我也看到了噴口故障,所以我懷疑這些故障來自螺栓A確認但沒有發出的消息。 – ab11