【问题标题】:How can I get a list of all `PartitionTopic`s for a topic in Confluent.Kafka?如何获取 Confluent.Kafka 中某个主题的所有“PartitionTopic”列表?
【发布时间】:2020-11-03 14:43:58
【问题描述】:

我正在使用confluent-kafka-dotnet (Confluent.Kafka) 为 Kafka 生成消息。

我想手动管理消息进入哪些分区,以保持某些消息组的顺序。

如何获取 Kafka 主题的 PartitionTopic 列表?

我看过 Java 中的 this solution。 但我不明白如何使用Confluent.Kafka 实现相同的功能。

另外,使用密钥发送消息也是可以接受的,因为可以保证相同的密钥位于相同的分区上。但同样,我找不到使用除Null 之外的任何密钥类型创建new Message 的方法。因此,使用非空键发送消息的示例会有所帮助。

【问题讨论】:

标签: c# apache-kafka


【解决方案1】:

我发现我无法使用非空键创建消息的原因是我使用<Null, ...> 指定了我的生产者。

感谢 mjwills 向我询问最小可重现示例,这促使我解决了这个问题。

【讨论】:

    【解决方案2】:

    要获取单个主题的 TopicPartitions 列表,您可以使用 AdminClient 类:

    using (var adminClient = new AdminClientBuilder(new AdminClientConfig { BootstrapServers = "bootstrap-servers" }).Build())
    {
        var meta = adminClient.GetMetadata(TimeSpan.FromSeconds(20));
    
        var topic = meta.Topics.SingleOrDefault(t => t.Topic == "topic-name");
    
        var topicPartitions = topic.Partitions;
    }
    

    您可以找到更多 AdminClient 示例here。但请注意警告,上面写着:“此功能的 API 可能会发生变化。”

    【讨论】:

    • 这不起作用。这将返回具有 PartitionMetadata 的 TopicMetadata。在 KafkaAdmin 中,PartitionTopic 是一个不同的对象。
    • @TheAlgorist 在 confluent-kafka-dotnet 中没有 PartitionTopic 这样的类。也许您指的是TopicPartition?如果是,则从 AdminClient 检索到的 PartitionMetadata 和主题名称足以为您的主题构造 TopicPartition 对象。
    猜你喜欢
    • 2023-02-02
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多