2017-09-27 131 views
0

我想讓我的頭關於卡夫卡消費者,我想知道是否可以使用卡夫卡解決以下用例。卡夫卡 - 同步消費羣體

我的使用情況基本上是這樣一個:

我有,我想用幾個消費者同步被消費流。換句話說,我有第一個消費者開始消費流,然後另一個消費者到達。我希望第二個消費者開始消費當前是第一個消費者的偏移量處的流。

我知道我需要讓消費者分成兩組。但目前尚不清楚對我說:

  • 它是如何,或者如果可以協調組偏移
  • 如果我希望這種協調任務

回答

1

等待時間你並不需要兩個不同的羣體,所有消費者都可以查看一個主題或者就他們喜歡而言,就此而言。

偏移

消息通常是由他們的到來日期確定的,因此,所有的客戶需要告訴製片「我上次訪問是在上午10點,給我的所有新郵件」。所以每個客戶需要跟蹤的是最後一次檢查哪個單獨主題。

延遲

這是一種 「範圍」 在這一點上。當然會有延遲,但是這取決於環境,如「有多少消費者」,「有多少話題」,「郵件格式」等

所以你的用例使用卡夫卡

來解決

總之:是的。 「一個消費者可以繼續在另一個消費者身邊」,消費者可以在彼此之間交換最新的索引,當然這需要一些內部同步。卡夫卡本身並不關心消費者,所以它不會追蹤最新的指數。你需要做這項工作。另一種可能性是實際使用消息(例如,一旦消費後將它們從隊列中刪除),因此每當另一個消費者點擊隊列時,它就保證接收另一個消費者停止的消息。當然,這取決於你的用例,你真的可以從隊列中刪除你的消息嗎?

+0

我建議兩個不同的組,因爲每個消費者都應該使用相同的消息。我的理解是,直到今天,一旦消費者消費了消息,另一消費者就不能消費它,除非它屬於不同的羣體。 – Serge

+0

它取決於「模式」,如果您選擇將所有消息保留在隊列中,例如一個月,任何消費者都可以讀取所有消息。他們需要告訴隊列的是索引時間戳。隊列將在所述時間戳之後回答所有消息。把它看作是一個數據緩衝區,消費者實際上可以放棄他所有的數據,並從隊列中重新讀取它們。當然,消費者可以閱讀所有需要的主題,基本上卡夫卡並不關心消費者。或生產者,); – Nikolas

+0

看起來像是可以告訴一個「索引時間戳」只使用Java客戶端(使用offsetsForTimes)我還沒有找到它的Python或斯卡拉...有沒有另一種方式? – Serge

0

這不是直接由kafka處理的問題(消費者組是在成員之間分配分區,而不是歸屬相同的偏移量),但是您可以爲此進行一些處理。您可以簡單地創建另一個主題,其中consumer1將發佈消息讀取的偏移量或副本(因此您需要第b個消費者和生產者),並且您的其他同步消費者會對此作出反應 - 當然可能會有一些延遲爲了這。

你背後的用例是什麼?爲什麼你不能在不同的偏移量上使用?難道你不想讓一個消費者,然後將讀取的消息分派到不同的進程,以便它們確實同步?(沒有延遲)

你是什麼意思同步:如果消費者2(和3和更多)只消費消費者相同的消息1(即不能消耗更快,我假設在以前的解決方案)雖然這是可能的話,最好知道背後的原因,也許有更好的方法來處理數據

+0

在T1: - 所述第一消費者已經達到消息偏移量= N - 所述第二消費者開始到消耗同一主題的,但是從偏移= N 在下次民意調查,同時爲消費者應消耗相同的消息 – Serge

+0

井開始,當他們輪詢取決於他們處理消息的速度有多快,或者他們輪詢的時間確切。你試圖完成什麼? (爲什麼你需要精確的同步?) – Treziac