在我的情况下,我需要多个主题,每个主题与多个消费者链接。我想为每个主题设置一个消费者组。我在kafka
.net客户端中找不到任何方法,以便我可以动态创建使用者组并将该主题与该使用者组链接。我使用的是kafka 0.9.0
版本,请告诉我是否需要更改为kafka server
设置或Zookeeper
?
答案 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();
}
希望得到这个帮助。