2015-11-01 47 views
3

我的拓撲使用默認的KafkaSpout實現。在一些非常受控的測試中,我注意到噴嘴失敗的元組,即使我的所有螺栓都沒有失敗任何元組,並且我確定所有消息都在配置的超時內完全處理完畢。使用KafkaSpout,兩次查找元組會導致超時?

我也注意到了(由於我的螺栓有一些子分類結構),我的一個螺栓是兩次敲擊元組。當我解決這個問題時,噴嘴停止失敗的元組。

對不起,這不僅僅是一個健康檢查而是一個問題,但這是否有意義?我不明白爲什麼兩次查找同一個元組實例會導致Spout註冊超時,但它似乎是我的情況?

+0

Bam!我們有這個完全相同的問題!我認爲我們可以'不止一次'。我們有一個邊緣案例,我們可能在10分鐘內獲得一兩個案例。無法弄清楚。當我們解決額外的問題時,一切都消失了。謝謝! – markthegrea

回答

5

它確實有道理。

風暴以奇怪但有效的方式跟蹤噴口發出的元組的所有ack(直接和間接)。我不確定確切的算法,但它需要重複XOR'ing最初的噴口發出的元組ID和後續錨定元組ID的ID。每個後續ID都被XOR兩次 - 一次是元組被錨定時,一次是元組被捕獲時。當XOR的結果全部爲零時,假設每個錨點都通過ack匹配,並且原始噴口發射的元組已經完成處理。通過不止一次地檢查一些元組,你看起來似乎一些噴口發出的元組沒有完全完成(因爲奇數個XOR將永遠不會被清零)。

+0

So lemme ask a question。我們發生了這種情況,但最終他們都清除了。風暴如何知道元組何時完成?由於拓撲結構本身發送發射信號,它是否等了一段時間纔會說出「我一段時間沒有聽到任何聲音,它必須完成?」。例如,我有2個螺栓,只有1/2發射到第二個螺栓。對於一個只能進入第一個螺栓的元組,並且得到適當的迴應,風暴何時結束元組結束? – markthegrea

+0

這是一個時機問題。只要所有的錨都被ACK「關閉」,處理就被認爲是完成的。在你的情況下,你只有在你確定出站元組之後才能確認入站元組。這樣,如果有更多的處理要做,就要確保始終有一個未確認的錨點。 –

+0

那麼你是說你必須在發出之前發出? – markthegrea

相關問題