当Broker关闭,然后稍后恢复活动时,Kafka Consumer不会收到“旧-未成功提交”消息

时间:2019-11-14 02:47:52

标签: c# apache-kafka kafka-consumer-api confluent-kafka

我正在使用confluent.kafka dotnet Nuget软件包

Nuget版本1.2.1

操作系统:Windows 10

消费者配置:

                    EnableAutoCommit = false
                    SessionTimeoutMs = 60000
                    EnablePartitionEof = true
                    AutoOffsetReset = AutoOffsetReset.Earliest
                    ReconnectBackoffMs = 0

说明

当代理关闭时,我正在尝试解决此问题,消费者无法提交消息并从头到尾运行。 然后经纪人复活了,Consumer没有收到未成功提交给Broker的旧消息,只是继续监听,什么也没有发生。

只有当我向代理发送新消息时,消费者才开始再次使用旧消息和新消息。

如何复制

  • 1个经纪人
  • 1个制作人
  • 1位消费者

确保消费者正在处理消息。

关闭经纪人。

看到使用者仍在处理并提交失败的消息。

等待消费者完成工作。

启动代理。

请等待,确认消费者没有收到未提交的旧消息。

代码

using (var consumer = new ConsumerBuilder<Ignore, string>(config).Build())
                    {
                        consumer.Subscribe(txt_topic.Text.Trim());
                        AppendMessage($"Subscribed to TOPIC {consumer.Subscription[0]} - Waiting for messages");
                        try
                        {
                            while (true)
                            {
                                try
                                {
                                    ConsumeResult<Ignore, string> consumeResult = consumer.Consume(TimeSpan.FromSeconds(5));
                                    if (consumeResult == null)
                                    {
                                        if (!chx_StopSpam.Checked)
                                            AppendMessage(
                                                $"======= No new message from {txt_server.Text.Trim()} ======="
                                            );
                                        continue;
                                    }
                                    if (consumeResult.IsPartitionEOF)
                                    {
                                        AppendMessage(
                                            $"====== Reached end of topic [{consumeResult.Topic}] - PARTITION {consumeResult.Partition} ======"
                                        );
                                        continue;
                                    }
                                    else
                                    {
                                        AppendMessage("========================================");
                                        AppendMessage($"{DateTime.Now.ToString("HH:mm:ss.fff")} Received message at PARTITION {consumeResult.Partition} - OFFSET {consumeResult.Offset}");
                                        AppendMessage($"{DateTime.Now.ToString("HH:mm:ss.fff")} Handling message...");
                                        try
                                        {
                                            Thread.Sleep(int.Parse(txt_handle.Text.Trim()));
                                            consumer.Commit(consumeResult);
                                            AppendMessage($"{DateTime.Now.ToString("HH:mm:ss.fff")} Commited PARTITION {consumeResult.Partition} - OFFSET {consumeResult.Offset}.");

                                        }
                                        catch (KafkaException e)
                                        {
                                            AppendMessage($"{DateTime.Now.ToString("HH:mm:ss.fff")} Commit error: {e.Error.Reason}");
                                        }
                                    }
                                }
                                catch (ConsumeException e)
                                {
                                    AppendMessage($"{DateTime.Now.ToString("HH:mm:ss.fff")} Consume error: {e.Error.Reason}");
                                }
                            }
                        }
                        catch (OperationCanceledException)
                        {
                            AppendMessage($"{DateTime.Now.ToString("HH: mm:ss.fff")} Closing consumer.");
                            consumer.Close();
                        }

0 个答案:

没有答案