如何使用Confluent.Kafka .Net Client创建Kafka主题

时间:2018-04-27 13:23:55

标签: c# .net apache-kafka confluent

Kafka(https://github.com/confluentinc/confluent-kafka-dotnet)最受欢迎的.net客户端似乎缺少设置和创建主题的方法。 致电Producer.ProduceAsync()时,会自动创建主题,但我找不到设置分区,保留政策和其他设置的方法。

我试图在网上找到任何例子,但我发现只是使用默认值。

也许还有另一个我可以使用的.net客户端?

3 个答案:

答案 0 :(得分:0)

Confluent.Kafka.AdminClient在版本1.0.0-experimental-2中可用,但不允许创建主题等。

它建立在librdkafka which doesn't have APIs for this yet

之上

所以现在你必须使用例如在代理上配置它。 bin\windows\kafka-topics.sh --create ...

答案 1 :(得分:0)

Confluent尚未提供任何API来从点网客户端创建主题,但是有一种解决方法。

  
      
  1. 在kafka配置中设置auto.create.topics.enable = true

  2.   
  3. 使用var brokerMetadata = producer.GetMetadata(false, topicName);查询现有代理中的可用主题(如果指定的主题是   不可用,那么kafka将创建一个具有指定名称的主题。

  4.   
    private static bool CreateTopicIfNotExist(Producer producer, string topicName)
    {
        bool isTopicExist = producer.GetMetadata().Topics.Any(t => t.Topic == topicName);
        if (!isTopicExist)
        {
            //Creates topic if it is not exist; Only in case of auto.create.topics.enable = true is set into kafka configuration
            var topicMetadata = producer.GetMetadata(false, topicName).Topics.FirstOrDefault();
            if (topicMetadata != null && (topicMetadata.Error.Code != ErrorCode.UnknownTopicOrPart || topicMetadata.Error.Code == ErrorCode.Local_UnknownTopic))
                isTopicExist = true;
        }
        return isTopicExist;
    }

因此,您可以使用此解决方法,我知道这是肮脏的解决方案,但到目前为止似乎没有其他方法。

答案 2 :(得分:0)

现在可以在最新版本的Confluent.Kafka .Net客户端库中使用它。

请参阅:https://github.com/confluentinc/confluent-kafka-dotnet/blob/b7b04fed82762c67c2841d7481eae59dee3e4e20/examples/AdminClient/Program.cs

        using (var adminClient = new AdminClientBuilder(new AdminClientConfig { BootstrapServers = bootstrapServers }).Build())
        {
            try
            {
                await adminClient.CreateTopicsAsync(new TopicSpecification[] { 
                    new TopicSpecification { Name = topicName, ReplicationFactor = 1, NumPartitions = 1 } });
            }
            catch (CreateTopicsException e)
            {
                Console.WriteLine($"An error occured creating topic {e.Results[0].Topic}: {e.Results[0].Error.Reason}");
            }
        }