簡體   English   中英

Kafka-Streams 加入 2 個帶有 JSON 值的主題 | 背壓機制?

[英]Kafka-Streams Join 2 topics with JSON values | backpressure mechanism?

我正在學習 Kafka Streams 並嘗試實現以下目標:

創建了 2 個 Kafka 主題(比如 topic1、topic2),以 null 作為鍵,JSONString 作為值。 來自主題 1(無重復)的數據在主題 2 中有多個匹配條目。 即 topic1 有一些主流數據,當與 topic2 連接時,可以生成新的多數據流。

例子:

topic1={"name": "abc", "age":2}, {"name": "xyz", "age":3} and so on.
topic2={"name": "abc", "address"="xxxxxx"}, {"name": "abc", "address"="yyyyyy"}, {"name": "xyz", "address"="jjjjjj"}, {"name": "xyz", "address"="xxxkkkkk"}

預期輸出: {"name": "abc", "age":2, "address"="xxxxxx"}, {"name": "abc", "age":2, "address"="yyyyyy"}, {"name": "xyz", "age":3, "address"="jjjjjj"}, {"name": "xyz", "age":3, "address"="xxxkkkkk"}

想保留/保留來自 topic1 的數據流以供將來參考,而來自 topic2 的數據流僅用於實現上述用例,不需要任何持久性/保留。

我有幾個問題:1)應該將 topic1 數據流保留/存儲幾天(可能?),以便可以加入來自 topic2 的傳入數據流。 是否可以? 2)我應該用什么來實現這一點,KStream 還是 KTable? 3)這叫背壓機制嗎?

Kafka Stream 是否支持此用例,還是我應該注意其他事項? 拜托,建議。

我已經嘗試了一段帶有 5 分鍾窗口的 KStream 代碼,但看起來我無法在流中保存 topic1 數據。

請幫助我做出正確的選擇並加入。 我正在使用 Confluent 中的 Kafka 和 Docker 實例。

public void run() {
        final StreamsBuilder builder = new StreamsBuilder();
        final Serde<JsonNode> jsonSerde = Serdes.serdeFrom(new JsonSerializer(), new JsonDeserializer());
        final Consumed<String, JsonNode> consumed = Consumed.with(Serdes.String(), jsonSerde);

        // Hold data from this topic to 30 days
        KStream<String, JsonNode> cs = builder.stream("topic1", consumed);
        cs.foreach((k,v) -> {
            System.out.println( k + " --->" + v);
        });

        // Data is involved in one time process.
        KStream<String, JsonNode> css = builder.stream("topic2", consumed);
        css.foreach((k,v) -> {
            System.out.println( k + " --->" + v);
        });

        KStream<String, JsonNode> resultStream = cs.leftJoin(css,
                valueJoiner,
                JoinWindows.of(TimeUnit.MINUTES.toMillis(5)),
                Joined.with(
                        Serdes.String(), /* key */
                        jsonSerde,       /* left value */
                        jsonSerde)       /* right value */
        );

        resultStream.foreach((k, v) -> {
            System.out.println("JOIN STREAM: KEY="+k+ ", VALUE=" + v);
        });

        KafkaStreams streams = new KafkaStreams(builder.build(), properties);
        streams.start();
    }

Kafka 中的聯接始終基於鍵。 (*)因此,要進行任何連接,您需要在進行實際連接之前將要連接的字段提取到鍵中(唯一的部分例外是 KStream-GlobalKTable 連接)。 在您的代碼示例中,您不會得到任何結果,因為所有記錄都有一個null鍵,因此無法加入。

對於連接本身,似乎 KStream-KTable 連接將是您的用例的正確選擇。 要完成這項工作,您需要:

  1. topic1正確設置連接鍵並將數據寫入附加主題(我們稱之為topic1Keyed
  2. 閱讀topic1Keyed作為表
  3. topic2正確設置連接鍵
  4. topic2KTable連接KTable

有關連接語義的完整詳細信息,請查看此博客文章: https : //www.confluent.io/blog/crossing-streams-joins-apache-kafka/

(*) 更新:

從 2.4 版本開始,Kafka Streams 也支持外鍵表-表連接。

暫無
暫無

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

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