簡體   English   中英

Kafka Streams:我們是否應該提前 stream 時間來測試窗口抑制?

[英]Kafka Streams: Should we advance stream time per key to test Windowed suppression?

我從這篇博客本教程中了解到,為了使用事件時間語義測試抑制,應該發送虛擬記錄以提前 stream 時間。 我試圖通過這樣做來提前時間。 但這似乎不起作用,除非為特定鍵提前時間。

我有一個自定義TimestampExtractor ,它將我喜歡的“流時間”與記錄相關聯。 我的 stream 拓撲偽代碼如下(我使用的是 Kafka Streams DSL API):

    source.mapValues(someProcessingLambda)
          .flatMap(flattenRecordsLambda)
          .groupByKey(Grouped.with(Serdes.ByteArray(), Serdes.ByteArray()))
          .windowedBy(TimeWindows.of(Duration.ofMinutes(10)).grace(Duration.ZERO))
          .aggregate(()->null, aggregationLambda)
          .suppress(Suppressed.untilWindowCloses(Suppressed.BufferConfig.unbounded()));

我的輸入格式如下:

   1 - {"stream_time":"2019-04-09T11:08:36.000-04:00", id:"1", data:"..."}
   2 - {"stream_time":"2019-04-09T11:09:36.000-04:00", id:"1", data:"..."}
   3 - {"stream_time":"2019-04-09T11:18:36.000-04:00", id:"2", data:"..."}
   4 - {"stream_time":"2019-04-09T11:19:36.000-04:00", id:"2", data:"..."}
    .
    .

現在根據stream_time ,記錄12屬於一個10分鍾的window, 34屬於另一個。 在該 window 中,記錄按id聚合。 我預計記錄3將表明 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 已前進並導致抑制發出與第一個 window 對應的數據。 但是,直到我發送帶有id:1的虛擬記錄以提前該密鑰的 stream 時間之前,才會發出數據。

我是否錯誤地理解了測試說明? 這是預期的行為嗎? 虛擬記錄的密鑰重要嗎?

我很抱歉給您帶來麻煩。 這確實是一個棘手的問題。 我有一些想法可以添加一些操作來支持這種集成測試,但是如果不破壞基本的 stream 處理時間語義,就很難做到。

聽起來您正在測試“真正的”KafkaStreams 應用程序,而不是使用 TopologyTestDriver 進行測試。 我的第一個建議是,如果 TopologyTestDriver 滿足您的需求,您將有更好的時間使用 TopologyTestDriver 來驗證您的應用程序語義。

在我看來,您的輸入主題(以及您的應用程序)中可能有多個分區。 如果密鑰 1 進入一個分區,而密鑰 3 進入另一個分區,您將看到所觀察到的情況。 應用程序的每個分區獨立跟蹤 stream 時間。 TopologyTestDriver 工作得很好,因為它只使用一個分區,還因為它同步處理數據。 否則,您將不得不將 go 的“虛擬”時間推進消息制作到與您嘗試清除的密鑰相同的分區。

這將特別棘手,因為您的“flatMap().groupByKey()”將重新分區數據。 您必須制作虛擬消息,以便在重新分區后進入正確的分區。 或者您可以嘗試將虛擬消息直接寫入重新分區主題。

如果您確實需要使用 KafkaStreams 而不是 TopologyTestDriver 進行測試,我想最簡單的方法就是為每個鍵寫一條“時間推進”消息,正如您在問題中所建議的那樣。 不是因為它是絕對必要的,而是因為它是滿足所有這些警告的最簡單方法。 我還要提到,我們正在對 Kafka Streams 中的 stream 時間處理進行一些一般性改進,這應該會顯着簡化情況,但這當然對你現在沒有幫助。

暫無
暫無

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

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