Kafka消费者停止消费消息

时间:2017-04-25 21:21:49

标签: java apache-kafka

我有一个简单的kafka设置。生产者正在以高速率向单个分区生成消息。单个使用者正在使用来自此分区的消息。在此过程中,消费者可以多次暂停处理消息。暂停可以持续几分钟。在生产者停止生成消息之后,消费者将处理排队的所有消息。消费者似乎不会立即看到生产者发出的消息。我正在使用kafka 0.10.1.0。这里可以发生什么?以下是使用该消息的代码部分:

            while (true)
            {
                try
                {
                    ConsumerRecords<String, byte[]> records = consumer.poll(100);
                    for (final ConsumerRecord<String, byte[]> record : records)
                    {
                        serviceThread.submit(() ->
                        {
                            externalConsumer.accept(record);
                        });
                    }
                    consumer.commitAsync();
                } catch (org.apache.kafka.common.errors.WakeupException e)
                {
                }
            }

其中,Consumer是禁用自动提交的KafkaConsumer,最大轮询记录为100,会话超时为30000.serviceThread是ExecutorService。

生产者只需要调用KafkaProducer.send来发送ProducerRecord。

代理上的所有配置都保留为kafka默认值。

我也在使用kafka-consumer-groups.sh检查消费者没有消费消息时发生了什么。但是当发生这种情况时,kafka-consumer-groups.sh也会挂在那里,无法获取信息。有时它会触发消费者重新平衡。但并非总是如此。

1 个答案:

答案 0 :(得分:0)

对于那些觉得这有帮助的人。我经常遇到这个问题(当 kafka 悄然 据称停止消费时),而且每次它实际上都不是 Kafka 的问题。

通常是一些长时间运行或挂起的静默进程阻止 Kafka 提交偏移量。例如,尝试连接到数据库的数据库客户端。如果您等待的时间足够长(例如 SQLAlchemy 和 Postgres 为 15 分钟),您将看到一个异常将打印到 STDOUT,并显示类似 connection timed out 的内容。