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

时间:2018-04-27 14:51:32

标签: c# apache-kafka kafka-consumer-api confluent-kafka

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

Class Consumer<TKey, TValue> 

上面的消费者类实现了一个高级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>

毕竟,我的问题是,密钥的反序列化真正意味着什么?为什么我们需要这样做?另外,为什么我们需要传入一个键值对忽略,字符串来执行反序列化?

1 个答案:

答案 0 :(得分:0)

  

为什么我们需要传入一个键值对Ignore,String来执行反序列化?

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

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

null, new StringDeserializer(Encoding.UTF8))

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

密钥决定了您将从中发起的消息的主题分区。空键将在主题

中平均分配