2017-12-27 481 views
0

如何使用Apache Kafka產生/消費延遲消息?看起來像標準的Kafka(和Java kafka-client)功能沒有這個功能。我知道我可以用標準的等待/通知機制自己實現它,但它看起來不太可靠,所以我們讚賞任何建議和良好做法。卡夫卡延遲消息消耗

找到related question,但它沒有幫助。 正如我所看到的:Kafka基於文件系統的連續讀取,並且只能用於直接讀取保留消息排序的主題。我對嗎?

回答

2

事實上,kafka最低結構是一個分區,它是具有增量偏移量的隊列中的順序事件 - 您在生成時不能在其他地方插入日誌。沒有延遲信息的概念。

你想要達到什麼樣的目的?

在你的情況下,一些可能性:

  • 你想在一個特定的時間來推動信息(例如,事件「開始工作」)。在這種情況下,使用計劃任務(不是來自kafka,在您的操作系統/語言/自定義應用程序中使用某種標準方式)在給定時間發送消息 - 消費者將在適當的時間收到消息。

  • 您想現在發送一個活動,但現在消費者不應該考慮這個活動。在這種情況下,您可以使用自定義結構,在其有效載荷中包含「時間」。消費者必須瞭解這個領域,並有定製的處理來處理它。例如:「2017-12-27T20:00:00Z開始工作」。您也可以爲此使用標題,但現在所有客戶端不支持標題。

  • 您可以更改發送的消息的時間戳。在內部,它仍然是按順序讀取的,但是一些暗示時間的函數會以不同的方式工作,並且消費者可以使用消息的時間戳來進行動作 - 這與之前的命題有些類似,除了時間戳是事件的一個元數據,而不是事件有效載荷本身。我個人不會使用它 - 我只在處理某些事件時處理時間戳。

爲了您的最後一個問題:基本上,是的,但也有一些注意事項:

  • 主題實際上是一分爲分區,以便只保存在分區。所有具有相同密鑰的消息都發送到同一個分區。
  • 大多數的時候,你只能從內存中讀取,但如果你讀舊的事件 - 在這種情況下,那些被依次從磁盤讀取,這是非常快
  • 您可以選擇從哪裏開始看 - 一個給定的偏移或給定的時間 - 甚至在運行時改變它
  • 可以並行讀取整個過程 - 多個消費者可以讀取相同的主題,從不閱讀相同的消息兩次(每次讀取不同的分區,請參見消費羣體)
+0

非常感謝您的解釋!我正在重新考慮我關於延遲信息的方法。 – Everv0id

-1

配置消費者本身可能是解決方案。

使用波紋管的配置屬性值#

max.poll.interval.ms 
max.poll.records 
fetch.max.wait.ms 

或基於需求。

consumer configuration