簡體   English   中英

延遲 Kafka Streams 消費

[英]Delaying Kafka Streams consuming

我正在嘗試使用Kafka Streams (即不是簡單的 Kafka 消費者)從重試主題中讀取以前無法處理的事件。 我希望從重試主題中消費,如果處理仍然失敗(例如,如果外部系統停機),我希望將事件放回重試主題。 因此,我不想立即繼續消費,而是在消費前等待一段時間,以免系統被暫時無法處理的消息淹沒。

簡化后,代碼目前執行此操作,我希望為其添加延遲。

fun createTopology(topic: String): Topology {
    val streamsBuilder = StreamsBuilder()

    streamsBuilder.stream<String, ArchivalData>(topic, Consumed.with(Serdes.String(), ArchivalDataSerde()))
        .peek { key, msg -> logger.info("Received event for key $key : $msg") }
        .map { key, msg -> enrich(msg) }
        .foreach { key, enrichedMsg -> archive(enrichedMsg) }

    return streamsBuilder.build()
}

我嘗試使用 Window Delay 來設置它,但沒有設法讓它工作。 我當然可以在peek做一個 sleep ,但這會留下一個線程掛起並且聽起來不是一個非常干凈的解決方案。

延遲如何工作的確切細節對我的用例來說並不是非常重要。 例如,所有這些都可以正常工作:

  1. 過去x秒內該主題上的所有事件都被一次性消耗掉。 開始/完成消費后,流等待x秒,然后再次消費
  2. 每個事件在放在主題上x秒后處理
  3. 流消耗消息,每個事件之間的延遲為x

如果有人能提供幾行 Kotlin 或 Java 代碼來完成上述任何一項,我將不勝感激。

您不能真正使用 Kafka Streams 暫停從輸入主題中讀取——“延遲”的唯一方法是調用“睡眠”,但正如您所提到的,這會阻塞整個線程並且不是一個好的解決方案。

但是,您可以做的是使用有狀態處理器,例如process() (帶有附加狀態存儲)而不是foreach() 如果重試失敗,您不會將記錄放回輸入主題,而是將其放入存儲中,並注冊一個具有所需重試延遲的標點符號。 如果標點被觸發,你重試,如果重試成功,你從存儲中刪除條目並取消標點; 否則,您將等到標點符號再次觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM