C# Confluent.Kafka 使用心得

天大地大妈咪最大 提交于 2020-02-28 12:51:15

一、遇到问题: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程序,欢迎朋友交流学习:

https://download.csdn.net/download/ybb350680013/12197723

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!