簡體   English   中英

Kafka Streams 控制流

[英]Kafka Streams Flow Of Control

我有一個關於 kafka 流應用程序中控制流的基本問題。 如果有兩個源主題 A 和 B。假設 A 的記錄的時間戳早於 B。流應用程序處理記錄的順序是否有保證?

我做了一個非常基本的測試,並在它們被消耗時偷看記錄,並通過 Instant.now 的簡單輸出打印它們被處理的瞬間

KStream<String, String> akStream= builder.stream("A",
        Consumed.with(Serdes.String(), Serdes.String()).withOffsetResetPolicy(Topology.AutoOffsetReset.EARLIEST))
        .peek((s, string) -> System.out.println("Topic A at " + Instant.now() ));

KStream<String, String> bkStream= builder.stream("B",
        Consumed.with(Serdes.String(), Serdes.String()))
        .peek((s, string) -> System.out.println("Topic B " + Instant.now()));

這些是主題中記錄的開始和結束時間戳

A : 2020-03-27 14:36:04 (epoch: 1585316164843) 2020-03-27 14:34:02 (epoch: 1585316042569)
B : 2020-03-30 11:04:17 (epoch: 1585559057167) 2020-03-17 14:44:38 (epoch: 1584452678527)

主題 B 記錄在主題 A 之前被拾取。Sysout 顯示來自主題 B 的所有記錄 有人可以幫助理解這一點嗎? 在編寫具有多個輸入源的流應用程序時,我想使用這種理解。

提前致謝

您構建流的方式,每個流都單獨存在,沒有排序保證。

關於基於時間戳處理記錄。 您只能在一個時間窗口內執行此操作。 例如,如果您有兩個主題 A 和 B,您可以加入它們,並使用時間窗口對事件進行排序。

<VO,VR> KStream<K,VR> join​(KStream<K,VO> otherStream,
                           ValueJoiner<? super V,? super VO,? extends VR> joiner,
                           JoinWindows windows)

這取決於。 一般情況下,不保證不同主題之間的處理順序。 但是有一個例外:如果單個任務處理來自不同主題的數據,則記錄將按時間戳順序處理。 然而,這是一種盡力而為的方法; 從 Kafka Streams 2.3 開始,這些排序保證得到了改進,您可以使用max.task.idle.ms配置來影響它們。

暫無
暫無

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

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