首页 文章

在 Confluent Kafka 的消费者类中,关键字的反序列化意味着什么?

提问于
浏览
1

汇合的 kafka 文档说,Consumer 类定义如下:

Class Consumer<TKey, TValue>

上面的使用者类实现了 high-level 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 初始化为

Consumer<Ignore, string>

并将消息初始化为

Message<Ignore, String>

毕竟,我的问题是,密钥的反序列化真正意味着什么?为什么我们需要这样做?另外,为什么我们需要传入 key-value 对 Ignore,String 来执行反序列化?

1 回答

  • 1

    为什么我们需要传入 key-value 对 Ignore,String 来执行反序列化?

    您无需传递这些特定设置。您需要匹配生产者的设置。或者,如果您不确定,您将为键和值提供字节数组对象。

    如果生产者没有发送密钥(例如 null),则无需反序列化。我认为这是 Ignore 类的用途。请注意,您没有提供密钥反序列化程序类,但是为该值做了

    null, new StringDeserializer(Encoding.UTF8))
    

    所有 Kafka 消息仅包含键,值对作为字节。生产者使用序列化器,作为消费者,您需要反序列化。理想情况下,您将消息反序列化为实际对象,例如字符串或 JSON 对象或 Avro,Protobuf 等等。

    默认情况下,密钥决定了您将从中发起的消息的主题分区。空键将在主题中平均分配。否则,生产者应用程序可以定义自己的分区器,并在逻辑决定的任何地方发送数据

相关问题