一、遇到问题:Confluent.Kafka.KafkaException: Broker: Specified group generation id is not valid
这个问题很诡异,网卡一直没有找到解决方案。
首先来说,出现这个问题环境。
1.创建一个分了3个区的topic。
2.启动一个生产者。
3.消费者用手动提交偏移量的方式,且拿到队列之后,每个消息处理时间大约20ms。
4.依次启动三个消费者,前面的消费就会报这样的错。
猜测:可能是因为手动提交偏移量,不及时,导致服务器不当知道如何再分配到三个分区上面。
解决:不用手动提交偏移量方式。//c.Commit();
因为即使用了手动提交偏移量的试,并且最后不提交,消费者拿到的偏移量也是会变化到下一个的。查阅资料,这个是消费者与服务器之间的Session连接后,本地会有一个偏移量,会自动变化到下一个。但是消费者如果断开,再次连接,又会从头获取队列。
二、问题:Kafka设置为手动提交偏移量时,消费者不提交偏移量,也会自动拿下一条队列。
此问题是kafka自己的机制问题,导致程序最初的错误设计:当处理消息失败时,不提交偏移量,直接处理消息,这样拿到的也是下一条队列。
解决:不用手动提交偏移量的方式,还是采用自动提交,出错的时候,记录topic和offset。单独出错处理!
三、测试代码,生产者与消费者。
static class Production
{
private static readonly ProducerConfig conf = new ProducerConfig { BootstrapServers = "172.27.9.169:9092" };
private static readonly string pushTopic = "KAISEN2020";
private static IProducer<Null, string> p = new ProducerBuilder<Null, string>(conf).Build();
private static int num = 0;
private static async void ProduceAsync(string str)
{
try
{
var ret = await p.ProduceAsync(pushTopic, new Message<Null, string> { Value = str });
var flag = ret.Status == PersistenceStatus.Persisted;
Console.WriteLine($"Production<{num++}>:{str}");
}
catch (Exception e)
{
Console.WriteLine($"Production<Error>:{e}");
}
}
public static void Start()
{
for(var i = 0; i < 10; i++)
{
ProduceAsync($"DEMO {i}");
Thread.Sleep(1000);
}
}
}
static class Consumer
{
private static readonly string bootstrapServers = "172.27.9.169:9092";
private static readonly string pollTopic = "KAISEN2020";
public static void Start()
{
try
{
var conf = new ConsumerConfig
{
BootstrapServers = bootstrapServers,
GroupId="kaisen",
AutoOffsetReset = AutoOffsetReset.Earliest,
EnableAutoCommit = false
};
using (var c = new ConsumerBuilder<Ignore, string>(conf).Build())
{
c.Subscribe(pollTopic);
CancellationTokenSource cts = new CancellationTokenSource();
while (true)
{
var cr = c.Consume(cts.Token);
if (cr == null)
{
Thread.Sleep(1000);
continue;
}
string xmlStr = cr.Value;
c.Commit();
Console.WriteLine($"Consumer:{xmlStr}");
}
}
}
catch(Exception ex)
{
Console.WriteLine($"Consumer<Error>:{ex}");
}
}
}
可直接运行的kafka demo程序,欢迎朋友交流学习:
来源:CSDN
作者:南郭未末
链接:https://blog.csdn.net/ybb350680013/article/details/104552808