Karafka为何周期性抛出查询水位线偏移量错误?
问题描述
在Ruby on Rails应用中使用Karafka gem生产和消费Kafka消息,配置文件karafka.rb如下:
# frozen_string_literal: true class KarafkaApp < Karafka::App setup do |config| config.kafka = {"bootstrap.servers": ENV["KAFKA_BOOTSTRAP_SERVERS"]} config.client_id = "store" config.consumer_persistence = !Rails.env.development? end Karafka.monitor.subscribe(Karafka::Instrumentation::LoggerListener.new) Karafka.producer.monitor.subscribe( WaterDrop::Instrumentation::LoggerListener.new(Karafka.logger) ) Karafka.monitor.subscribe "error.occurred" do |event| type = event[:type] error = event[:error] details = (error.backtrace || []).join("\n") puts "Oh no! An error: #{error} of type: #{type} occurred!" puts details puts "=" * 100 NewRelic::Agent.notice_error(error) end routes.draw do topic "payment-order" do consumer PaymentOrderConsumer end topic "payment-method-config" do consumer PaymentMethodConsumer end topic "order-refund" do consumer OrderRefundConsumer end end end Karafka::Web.enable!
运行一段时间后,系统周期性抛出错误:
Error querying watermark offsets for partition 0 of karafka_consumers_states - Local: Unknown partition (unknown_partition)
消费者仍能正常消费新消息,但该错误会定期出现。已尝试以下操作但未解决:
- 服务器安装bash和librdkafka
- 使用单台Kafka bootstrap服务器
- 确认
karafka_consumers_states主题已存在于Kafka服务器
解决方案
针对该周期性错误,可尝试以下排查和修复步骤:
检查Karafka Web主题的分区配置
执行Kafka命令查看karafka_consumers_states主题的详细信息,确认分区0是否存在:kafka-topics.sh --describe --topic karafka_consumers_states --bootstrap-server <你的Kafka地址>若主题存在但分区0缺失(比如主题被重建时分区数不匹配),可重新创建主题(注意:删除前确认数据可丢弃):
kafka-topics.sh --delete --topic karafka_consumers_states --bootstrap-server <你的Kafka地址> kafka-topics.sh --create --topic karafka_consumers_states --partitions 1 --replication-factor <你的副本数> --bootstrap-server <你的Kafka地址>升级Karafka及依赖版本
该错误可能是版本兼容问题,尝试升级到最新稳定版:bundle update karafka同时确保系统安装的librdkafka为最新版本,避免底层库的bug影响。
验证消费者状态持久化配置
检查karafka.rb中的config.consumer_persistence配置,确保环境判断逻辑正确:config.consumer_persistence = !Rails.env.development?生产环境下该配置应为
true,异常配置可能导致Karafka尝试访问不存在的分区。重启Karafka进程
旧的连接缓存可能导致分区识别异常,完全重启所有Karafka消费者进程,清除客户端缓存后重新建立连接。检查Kafka Broker的元数据状态
查看Kafka Broker日志,确认karafka_consumers_states主题的元数据是否被正确加载。单节点Broker需确保主题数据未损坏,多节点集群需确认元数据同步正常。
内容的提问来源于stack exchange,提问作者ramayeah
相关产品推荐
相关产品推荐

