var configs = new Dictionary<string, string>
{
{"bootstrap.servers", MY_SERVER},
{"security.protocol", "SASL_PLAINTEXT"},
{"sasl.mechanism", "SCRAM-SHA-256"},
{"sasl.username", "MY_USERNAME"},
{"sasl.password", "MY_PWD"},
{"group.id", "sample_group"} // added
};
var consumerConfig = new ConsumerConfig(configs);
using (var schemaRegistry = new CachedSchemaRegistryClient(schemaRegistryConfig))
using (var consumer = new ConsumerBuilder<string, MyModel>(consumerConfig)
.SetKeyDeserializer(new AvroDeserializer<string>(schemaRegistry, avroSerializerConfig).AsSyncOverAsync())
.SetValueDeserializer(new AvroDeserializer<MyModel>(schemaRegistry, avroSerializerConfig).AsSyncOverAsync())
.Build())
{
consumer.Subscribe(TOPIC_NAME);
while (true)
{
var result = consumer.Consume(); //stuck here
Console.WriteLine(result);
}
}
如代码中所述,consumer.Consume()
没有响应。即使在consumer.Subscribe()
期间也不会抛出任何错误消息,可能是什么原因? (我是Kafka Consumer的新手)
{"group.id", "sample_group"}
,并用ConsumerConfig
包装。是否为group.id允许使用随机名称(“ sample_group”),还是应该从“主题”信息中检索出来?答案 0 :(得分:0)
您的代码看起来不错,而且没有错误和异常的出现也是一个好兆头。
“ 1。主题中可能没有消息,所以什么也没收到?”
即使在Kafka主题中没有任何消息,您的观察也符合预期的行为。在while(true)
循环中,您一直在尝试从主题中获取数据,如果无法获取任何内容,则消费者将在下一次迭代中再次尝试。涉及Kafka主题的消费者应在连续运行的同时按顺序阅读主题。有时候,消费者已经消费了所有消息,并保持空闲一段时间,直到新消息进入主题,这是完全可以的。在等待时间内,消费者不会停止或崩溃。
请记住,默认情况下,Kafka主题中的邮件保留期限为7天。在那之后,邮件将被删除。
“ 2。代码要求缺少'group.id',因此我在配置中添加了{” group.id“,” sample_group“},并使用ConsumerConfig进行包装。是否为组使用了随机名称(” sample_group“)。 id还是应该是从Topic信息中检索到的东西?”
是的,名称“ sample_group”被允许作为ConsumerGroup名称。没有保留的使用者组名称,因此该名称不会造成任何麻烦。
“ 3。还有什么?”
默认情况下,KafkaConsumer从“最新”偏移量读取消息。这意味着,如果您是第一次运行ConsumerGroup,它将不会从头开始而是从头开始读取所有消息。检查.net Kafka-API文档中的使用者配置,以了解诸如auto_offset_reset
之类的内容。如果您想从头开始阅读所有消息,则可以将此配置设置为“最早”。请注意,第一次使用给定的ConsumerGroup运行应用程序时,第二次运行此应用程序时,此配置auto_offset_reset
不会产生任何影响,因为ConsumerGroup现在已在Kafka中注册。>
通常可以做的,以确保消费者实际上应该阅读消息是,如果您在之前启动了消费者,就会开始针对该主题生成消息。然后,(几乎)独立于您的配置,您应该会看到数据流过您的应用程序。