C# 使用来自卡夫卡主题的消息-无响应 var configs=新字典 { {“bootstrap.servers”,我的服务器}, {“安全协议”,“SASL_明文”}, {“sasl.机制”,“紧急停堆-SHA-256”}, {“sasl.username”,“MY_username”}, {“sasl.password”,“MY_PWD”}, {“group.id”,“sample_group”}//已添加 }; var consumerConfig=新的consumerConfig(配置); 使用(var schemaRegistry=new CachedSchemaRegistryClient(schemaRegistryConfig)) 使用(var consumer=new ConsumerBuilder(consumerConfig) .SetKeyDeserializer(新的AvroDeserializer(schemaRegistry,avroSerializerConfig).AssynCoverageSync()) .SetValueDeserializer(新的AvroDeserializer(schemaRegistry,avroSerializerConfig).AssynCoverageSync()) .Build()) { consumer.Subscribe(主题名称); while(true) { var result=consumer.consumer();//卡在这里 控制台写入线(结果); } }

C# 使用来自卡夫卡主题的消息-无响应 var configs=新字典 { {“bootstrap.servers”,我的服务器}, {“安全协议”,“SASL_明文”}, {“sasl.机制”,“紧急停堆-SHA-256”}, {“sasl.username”,“MY_username”}, {“sasl.password”,“MY_PWD”}, {“group.id”,“sample_group”}//已添加 }; var consumerConfig=新的consumerConfig(配置); 使用(var schemaRegistry=new CachedSchemaRegistryClient(schemaRegistryConfig)) 使用(var consumer=new ConsumerBuilder(consumerConfig) .SetKeyDeserializer(新的AvroDeserializer(schemaRegistry,avroSerializerConfig).AssynCoverageSync()) .SetValueDeserializer(新的AvroDeserializer(schemaRegistry,avroSerializerConfig).AssynCoverageSync()) .Build()) { consumer.Subscribe(主题名称); while(true) { var result=consumer.consumer();//卡在这里 控制台写入线(结果); } },c#,.net,apache-kafka,kafka-consumer-api,C#,.net,Apache Kafka,Kafka Consumer Api,如代码中所述,没有来自consumer.Consume()的响应。即使在consumer.Subscribe()期间,它也不会抛出任何错误消息。可能的原因是什么?(我是卡夫卡消费者的新手) 也许主题中没有消息,所以没有消息接收 代码要求缺少'group.id',因此我在config中添加了{“group.id”,“sample_group”},并用ConsumerConfig包装。group.id是否允许使用随机名称(“sample_group”),还是应该从主题信息中检索 还有别的吗 您的代码

如代码中所述,没有来自
consumer.Consume()
的响应。即使在
consumer.Subscribe()期间,它也不会抛出任何错误消息。可能的原因是什么?(我是卡夫卡消费者的新手)

  • 也许主题中没有消息,所以没有消息接收
  • 代码要求缺少'group.id',因此我在config中添加了
    {“group.id”,“sample_group”}
    ,并用
    ConsumerConfig
    包装。group.id是否允许使用随机名称(“sample_group”),还是应该从主题信息中检索
  • 还有别的吗

  • 您的代码看起来很好,没有出现错误和异常也是一个好迹象

    “1.可能主题中没有消息,因此没有可接收的内容?”

    即使卡夫卡主题中没有任何消息,您的观察结果也符合预期行为。在
    while(true)
    循环中,您不断尝试从主题获取数据,如果无法获取任何数据,消费者将在下一次迭代中重试。卡夫卡主题的消费者应该在连续运行的同时按顺序阅读主题。有时,消费者已经消费了所有消息,并在新消息到达主题之前闲置了一段时间,这是完全没有问题的。在等待期间,消费者不会停止或崩溃

    请记住,卡夫卡主题中的邮件默认保留期为7天。之后,这些消息将被删除

    “2.代码要求缺少'group.id',因此我在配置中添加了{”“group.id”“sample_group”“},并用ConsumerConfig包装。group.id是否允许使用随机名称(“sample_group”),还是应该从主题信息中检索?”

    是,允许将名称“sample_group”作为ConsumerGroup名称。没有保留的使用者组名称,因此此名称不会引起任何问题

    “3.还要别的吗?”

    默认情况下,卡夫卡消费者从“最新”偏移量读取消息。这意味着,如果您第一次运行ConsumerGroup,它将不会从头至尾读取所有消息。检查.net Kafka API文档中的使用者配置,以了解类似于
    自动偏移量重置的内容。您可以将此配置设置为“最早”,以防您要从头读取所有消息。请注意,当您第一次使用给定的ConsumerGroup运行应用程序时,第二次运行此应用程序时,此配置
    auto\u offset\u reset
    将不会产生任何影响,因为ConsumerGroup现在已在Kafka内注册


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

    类似于第一个问题-是否有活动的生产者在运行?默认情况下,您只能获得新的data@mike所以,如果主题中没有消息,consumer.consumer()不会退出吗?谢谢,迈克!对于#1点,它停留在consumer.Consume()上,而不是因为无限while循环。(已通过调试验证-未移至下一行)这就是为什么我想知道如果没有消息,consumer.Consume()是否不会退出。据我所知,.net API构建在Java Kafkanconsumer之上,如果没有要获取的消息,Java Kafkanconsumer会非常频繁地调用poll方法。
    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);
          }
     }