为多个主题创建多个使用者组

时间:2016-06-21 07:13:54

标签: apache-kafka

在我的情况下,我需要多个主题,每个主题与多个消费者链接。我想为每个主题设置一个消费者组。我在kafka .net客户端中找不到任何方法,以便我可以动态创建使用者组并将该主题与该使用者组链接。我使用的是kafka 0.9.0版本,请告诉我是否需要更改为kafka server设置或Zookeeper

2 个答案:

答案 0 :(得分:0)

我不确定你的意思"为每个主题设置一个消费者群体"。如果您启动一个新的使用者组(即,使用相应的组ID启动使用者),则使用者组将决定它想要使用哪个主题(通过仅订阅该主题)。它没有特殊的配置,因此,总是在主题订阅上动态创建一个组。

更新(.net客户端):

我不熟悉.net客户端。然而,根据Github页面(github.com/Jroland/kafka-net),似乎还没有支持消费者群体。

但是,您似乎可以使用白名单只读取某些分区。因此,您可以手动分配负载:

来自https://github.com/Jroland/kafka-net#consumer-1

  

如果未提供白名单,则将消耗所有分区,为每个分区负责人创建一个KafkaConnection

答案 1 :(得分:0)

我使用Microsoft .NET kafka构建了一个快速原型,如下所示。不确定它是否解决了你的问题。

但是,我强烈建议你使用这个库,因为它包含比kafka-net更多的功能(例如支持zookeeper来维护偏移,主题组等)。

https://github.com/Microsoft/CSharpClient-for-Kafka

示例代码

  

当消费者得到它时,这将向kafka发送10条消息并输出消息给控制台。

static void Main(string[] args)
    {
        Task.Factory.StartNew(() =>
        {
            ConsumerConfiguration consumerConfig = new ConsumerConfiguration
            {
                AutoCommit = true, 
                AutoCommitInterval = 1000, 
                GroupId = "group1",
                ConsumerId = "1",
                AutoOffsetReset = OffsetRequest.SmallestTime,
                NumberOfTries = 20,
                ZooKeeper = new ZooKeeperConfiguration("localhost:2181", 30000, 30000, 2000)           
            };
            var consumer = new ZookeeperConsumerConnector(consumerConfig, true);
            var dictionaryMapping = new Dictionary<string, int>();
            dictionaryMapping.Add("topic1", 1);

            var streams = consumer.CreateMessageStreams(dictionaryMapping, new DefaultDecoder());

            var messageStream = streams["topic1"][0];

            foreach (var message in messageStream.GetCancellable(new CancellationToken()))
            {
                Console.WriteLine("Response: P{0},O{1} : {2}", message.PartitionId, message.Offset, Encoding.UTF8.GetString(message.Payload));

                //If you set AutoCommit to false, you can commit by yourself from this command.
                //consumer.CommitOffsets()     
            }
        });


        var brokerConfig = new BrokerConfiguration()
        {
            BrokerId = 1,
            Host = "localhost",
            Port = 9092
        };
        var config = new ProducerConfiguration(new List<BrokerConfiguration> { brokerConfig });
        config.CompressionCodec = CompressionCodecs.DefaultCompressionCodec;
        config.ProducerRetries = 3;
        config.RequiredAcks = -1;            
        var kafkaProducer = new Producer(config);

        byte[] payloadData = Encoding.UTF8.GetBytes("Test Message");
        var inputMessage = new Message(payloadData);
        var data = new ProducerData<string, Message>("topic1", inputMessage);

        for (int i = 0; i < 10; i++)
        {
            kafkaProducer.Send(data);
        }

        Console.ReadLine();
    }

希望得到这个帮助。