簡體   English   中英

Confluent Kafka中Consumer class中密鑰的反序列化是什么意思?

[英]What does Deserialization of key mean in Consumer class in Confluent Kafka?

融合的 kafka 文檔說,消費者 class 定義如下:

Class Consumer<TKey, TValue> 

上面的消費者 class 實現了高級別的 Apache Kafka 消費者(帶有鍵和值反序列化)。

我知道 TKey 和 TValue 用於反序列化從生產者發送的密鑰。 例如,像

從生產者發送密鑰看起來像

var deliveryReport = producer.ProduceAsync(topicName, key, val);

在消費者端接收字符串鍵看起來像

using (var consumer = new Consumer<Ignore, string>(constructConfig(brokerList, false), null, new StringDeserializer(Encoding.UTF8)))
{
    consumer.Subscribe(topics);

    Console.WriteLine($"Started consumer, Ctrl-C to stop consuming");

    var cancelled = false;
    Console.CancelKeyPress += (_, e) => {
        e.Cancel = true; // prevent the process from terminating.
        cancelled = true;
    };

    while (!cancelled)
    {
        Message<Ignore, string> msg;
        if (!consumer.Consume(out msg, TimeSpan.FromMilliseconds(100)))
        {
            continue;
        }

        Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {msg.Value}");
    }
}

由於我們傳入一個密鑰,因此消費者被初始化為

Consumer<Ignore, string>

並且消息被初始化為

Message<Ignore, String>

畢竟,我的問題是,密鑰的反序列化到底意味着什么? 為什么我們需要這樣做? 另外,為什么我們需要傳入一個鍵值對Ignore, String來執行反序列化?

為什么我們需要傳入一個鍵值對 Ignore, String 來執行反序列化?

您不需要傳遞這些特定設置。 您需要匹配生產者的設置。 或者,如果您不確定,您可以為鍵和值提供字節數組 object。

如果生產者沒有發送密鑰,例如 null,則沒有什么可以反序列化。 我認為這就是 Ignore class 的用途。 請注意,您沒有提供密鑰解串器 class,但為值提供了

null, new StringDeserializer(Encoding.UTF8))

所有 Kafka 消息都包含鍵值對,僅作為字節。 生產者使用序列化器,作為消費者,您需要反序列化。 理想情況下,您將消息反序列化為實際對象,例如字符串或 JSON 對象或 Avro、Protobuf 等。

默認情況下,鍵決定了您將從哪個主題分區中消費消息。 null 密鑰將平均分布在主題中。 否則,生產者應用程序可以定義自己的分區器並在其邏輯決定的任何地方發送數據

暫無
暫無

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

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