[英]Consuming JSON values using kafka connect json api in kafka streams : JAVA
[英]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 ,但這會留下一個線程掛起並且聽起來不是一個非常干凈的解決方案。
延遲如何工作的確切細節對我的用例來說並不是非常重要。 例如,所有這些都可以正常工作:
x
秒內該主題上的所有事件都被一次性消耗掉。 開始/完成消費后,流等待x
秒,然后再次消費x
秒后處理x
秒如果有人能提供幾行 Kotlin 或 Java 代碼來完成上述任何一項,我將不勝感激。
您不能真正使用 Kafka Streams 暫停從輸入主題中讀取——“延遲”的唯一方法是調用“睡眠”,但正如您所提到的,這會阻塞整個線程並且不是一個好的解決方案。
但是,您可以做的是使用有狀態處理器,例如process()
(帶有附加狀態存儲)而不是foreach()
。 如果重試失敗,您不會將記錄放回輸入主題,而是將其放入存儲中,並注冊一個具有所需重試延遲的標點符號。 如果標點被觸發,你重試,如果重試成功,你從存儲中刪除條目並取消標點; 否則,您將等到標點符號再次觸發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.