消耗来自Kafka主题的消息-无响应

时间:2020-10-22 20:48:34

标签: c# .net apache-kafka kafka-consumer-api

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的新手)

  1. 主题中可能没有消息,所以什么也收不到?
  2. 代码要求缺少'group.id',因此我在配置中添加了{"group.id", "sample_group"},并用ConsumerConfig包装。是否为group.id允许使用随机名称(“ sample_group”),还是应该从“主题”信息中检索出来?
  3. 还有什么?

1 个答案:

答案 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中注册。

通常可以做的,以确保消费者实际上应该阅读消息是,如果您在之前启动了消费者,就会开始针对该主题生成消息。然后,(几乎)独立于您的配置,您应该会看到数据流过您的应用程序。