汇合的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>
毕竟,我的问题是,密钥的反序列化真正意味着什么?为什么我们需要这样做?另外,为什么我们需要传入一个键值对忽略,字符串来执行反序列化?
答案 0 :(得分:0)
为什么我们需要传入一个键值对Ignore,String来执行反序列化?
您无需传递这些特定设置。您需要匹配生产者的设置。或者,如果您不确定,您将为键和值提供字节数组对象。
如果生产者没有发送密钥,例如null,则无需反序列化。我认为这是Ignore类的用途。请注意,您没有提供密钥反序列化程序类,但为值
null, new StringDeserializer(Encoding.UTF8))
所有Kafka消息都包含仅作为字节的键值对。生产者使用序列化器,作为消费者,您需要反序列化。理想情况下,您将消息反序列化为实际对象,例如字符串或JSON对象或Avro,Protobuf等等。
密钥决定了您将从中发起的消息的主题分区。空键将在主题
中平均分配