如何使用Apache Kafka產生/消費延遲消息?看起來像標準的Kafka(和Java kafka-client)功能沒有這個功能。我知道我可以用標準的等待/通知機制自己實現它,但它看起來不太可靠,所以我們讚賞任何建議和良好做法。卡夫卡延遲消息消耗
找到related question,但它沒有幫助。 正如我所看到的:Kafka基於文件系統的連續讀取,並且只能用於直接讀取保留消息排序的主題。我對嗎?
如何使用Apache Kafka產生/消費延遲消息?看起來像標準的Kafka(和Java kafka-client)功能沒有這個功能。我知道我可以用標準的等待/通知機制自己實現它,但它看起來不太可靠,所以我們讚賞任何建議和良好做法。卡夫卡延遲消息消耗
找到related question,但它沒有幫助。 正如我所看到的:Kafka基於文件系統的連續讀取,並且只能用於直接讀取保留消息排序的主題。我對嗎?
事實上,kafka最低結構是一個分區,它是具有增量偏移量的隊列中的順序事件 - 您在生成時不能在其他地方插入日誌。沒有延遲信息的概念。
你想要達到什麼樣的目的?
在你的情況下,一些可能性:
你想在一個特定的時間來推動信息(例如,事件「開始工作」)。在這種情況下,使用計劃任務(不是來自kafka,在您的操作系統/語言/自定義應用程序中使用某種標準方式)在給定時間發送消息 - 消費者將在適當的時間收到消息。
您想現在發送一個活動,但現在消費者不應該考慮這個活動。在這種情況下,您可以使用自定義結構,在其有效載荷中包含「時間」。消費者必須瞭解這個領域,並有定製的處理來處理它。例如:「2017-12-27T20:00:00Z開始工作」。您也可以爲此使用標題,但現在所有客戶端不支持標題。
您可以更改發送的消息的時間戳。在內部,它仍然是按順序讀取的,但是一些暗示時間的函數會以不同的方式工作,並且消費者可以使用消息的時間戳來進行動作 - 這與之前的命題有些類似,除了時間戳是事件的一個元數據,而不是事件有效載荷本身。我個人不會使用它 - 我只在處理某些事件時處理時間戳。
爲了您的最後一個問題:基本上,是的,但也有一些注意事項:
配置消費者本身可能是解決方案。
使用波紋管的配置屬性值#
max.poll.interval.ms
max.poll.records
fetch.max.wait.ms
或基於需求。
非常感謝您的解釋!我正在重新考慮我關於延遲信息的方法。 – Everv0id