kafka消费者程序日志报错Offset commit failed问题研究

生产环境偶尔会遇到kafka消费者程序日志报错的问题

截取主要日志如下:

2023-10-02 19:35:28.554 {trace: d7f97f70dd693e3d} ERROR[Thread-49:137] ConsumerCoordinator$OffsetCommitResponseHandler.handle(812) - [Consumer clientId=consumer-1, groupId=cid_yingzi_fpf_group_device] Offset commit failed on partition topic_dvc_telemetery_bh_bh100-1 at offset 4313614: The request timed out.2023-10-02 19:35:28.554 {trace: d7f97f70dd693e3d} INFO [Thread-49:137] AbstractCoordinator.markCoordinatorUnknown(727) - [Consumer clientId=consumer-1, groupId=cid_yingzi_fpf_group_device] Group coordinator kafka02.yingzi.com:19292 (id: 2147483645 rack: null) is unavailable or invalid, will attempt rediscovery

kafka客户端版本为2.2.0

结合日志去阅读代码,只能大概定位到,是客户端程序向server发送commit offset请求的时候,server返回的错误信息是:The request timed out

看到 request timed out,第一时间很可能会误以为是客户端向server发送请求超时了。但是查看OffsetCommitResponseHandler.handle()的代码,发现server是成功返回信息了的。
server返回的数据是一个Map<TopicPartition, Errors>结构,每个partition都对应一个Errors结果,如果Errors为Errors.NONE,则表示offset提交成功。
如果Errors不为Errors.NONE,则打印错误日志,也就是上面的 Offset commit failed … The request timed out的日志,每个partition打印1条日志。
也就是说,问题发生在server内部处理的时候,可以排除掉是客户端和server的网络问题导致的超时

要继续深挖,需要了解下server的处理逻辑,server的入口代码在KafkaApis.handleOffsetCommitRequest()
查看代码逻辑,可以发现早期的offset是保存在zk中,新版本中改为存在kafka的topic中(往__consumer_offsets这个topic发消息,每个partition一条offset消息)
那么分析下来,大概率就是往__consumer_offsets topic发消息的时候,产生了超时

继续阅读client的代码,了解Offset commit的机制
在KafkaConsumer.poll()的代码中,每次拉取消息时,都会调用updateAssignmentMetadataIfNeeded()这个方法,这个方法最终会调用maybeAutoCommitOffsetsAsync()方法
maybeAutoCommitOffsetsAsync()方法根据autoCommitIntervalMs来判断,是否要提交offset
这里默认是5秒执行一次commit offset请求,每次会把订阅的所有topic和partition的信息都进行提交
每个topic每个partition对应1条消息,如果topic非常多的话,那往__consumer_offsets发送消息量也会很大

查看生产kafka的监控,__consumer_offsets每秒消息量大概为四五千
显然是不太合理的
于是通过命令去消费__consumer_offsets的数据进行查看,注意由于这里消息是序列化的,直接消费的话会显示乱码,要通过-formatter "kafka.coordinator.group.GroupMetadataManager$OffsetsMessageFormatter"去进行消息解码

测试环境消费命令如下:

/opt/software/kafka/kafka_2.11-2.0.0_test_yewu/bin/kafka-console-consumer.sh --topic __consumer_offsets --group yz.bigdata.tzy --bootstrap-server kafka-test01.yingzi.com:32295 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties

生产环境统计的消息量最多的group如下(消费25秒):

37485 cid_opf_scene_edgengine_offline_alarm
27216 idp_share_telemetery_scene
25776 idp_scene_lifecycle_offline_alarm
4892 cid_scene_dvc_tele_attr
1440 yingzi-scene-space-group
546 clickhouse-iotcenter-latest-rep
533 re-Main-consumer-b
533 clickhouse-iotcenter-rep
437 yingzi-bizcenter-dvc-telemetery-group
318 cid_yingzi_hwm_group
288 cid_yingzi_fpf_group_device
270 transport-b-node-tb-mqtt-transport-ca-b-8
258 transport-b-node-tb-mqtt-transport-ca-b-6
222 transport-b-node-tb-mqtt-transport-ca-b-5
208 tb-core-b-consumer
200 yz.bigdata.wns

排名前几的都是跟设备有关的,消费几百个topic
按照上面的分析,每个group每秒发送的消息量应该为:1 / auto-commit-interval * Sum(topic partirionNum)
但是实际计算下来,感觉不应该这么高才对

先针对cid_opf_scene_edgengine_offline_alarm这个group进行查看,这个group订阅的topic有250个,每个topic 6个partition
1/52506=300
但是实际37485/25 = 1500
差了5倍之多

于是找到对应的开发人员,查看kafka的配置,发现配置:spring.kafka.consumer.auto-commit-interval=1000

提交offset的间隔默认5秒,被人工修改为1秒,正好相差5倍
其他两个消息量很高的group,经分析也是一样的问题

沟通后建议还是把spring.kafka.consumer.auto-commit-interval配置改回默认值,后续再继续进行观察

当然问题的根本原因其实还是设计不合理,kafka的性能本身就是会随着topic的增多而降低的,设计上应该尽量避免产生很多个topic才对,这里就不再展开讨论了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络基础(三):IPv4编址方式、子网划分、IPv4通信的建立与验证及ICMP协议

**IPv4地址是一个32位长的二进制数。**而这个32位二进制数又通常会表示为4个用点隔开的十进制数。那么&#xff0c;这个32位二进制数要如何通过4个十进制数表示出来呢&#xff1f; 我们在配置IPv4地址时&#xff0c;同时配置的“掩码”又有何用途&#xff1f; 1.IPv4编址方式…

第 367 场 LeetCode 周赛题解

A 找出满足差值条件的下标 I 模拟 class Solution { public:vector<int> findIndices(vector<int> &nums, int indexDifference, int valueDifference) {int n nums.size();for (int i 0; i < n; i)for (int j 0; j < i; j)if (i - j > indexDiffe…

软件测试的调用接口怎么调用,逻辑是什么?

一、什么是接口测试&#xff1f; 接口测试是测试系统组件之间接口的测试。接口主要用于检测外部系统和内部子系统之间的交互点。测试的重点是检查数据交换、传输、控制和管理过程&#xff0c;以及系统之间的相互逻辑依赖。 二、为什么要做接口测试&#xff1f; 在淘宝系统的历…

Go编程:使用 Colly 库下载Reddit网站的图像

概述 Reddit是一个社交新闻网站&#xff0c;用户可以发布各种主题的内容&#xff0c;包括图片。本文将介绍如何使用Go语言和Colly库编写一个简单的爬虫程序&#xff0c;从Reddit网站上下载指定主题的图片&#xff0c;并保存到本地文件夹中。为了避免被目标网站反爬&#xff0c…

C++入门篇(3)---引用

1.引用 你有没有被人起过外号?比如身边的朋友,喊他的时候不会叫他的全名,像我很好的朋友,我一般都喜欢叫他"阿威",而不会去称呼全名.我叫他"阿威",他还是他没有什么问题. 这里新登场的引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&am…

多线程使用处理数据库导致锁表解决办法

问题描述&#xff1a; 当使用ON DUPLICATE KEY UPDATE的sql来访问时&#xff0c; 可能会出现多个线程同时写入一个已有的数据里。 解决办法&#xff1a; 使用 REPLACE INTO 原因&#xff1a; 保持更好的并发性&#xff1a;REPLACE INTO 在插入记录时会先删除原有记录&#xf…

数据结构---二叉树

树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 树形结构中&#xff0c;子树之间不能有交集&#xff0c;…

Ubuntu22常用软件

别存太多重要东西在Ubuntu &#xff0c;硬盘损坏就麻烦 Tweaks自定义UI sudo apt intall gnome-tweaks为了方便管理和添加&#xff0c;还需添加&#xff1a; sudo apt install gnome-shell-extension-prefs gnome-shell-extension-manager -y1.打开Extension应用&#xff0c;添…

1.Vue-在独立页面实现Vue的增删改查

题记 在独立页面实现Vue的增删改查&#xff0c;以下是具体的代码&#xff0c;和操作流程。 编写index.html页面 index.html文件如下&#xff1a; <!DOCTYPE html> <html> <head><title>Vue CRUD Example</title><!--在线导入vue文件-->&l…

如何在自动化测试中使用MitmProxy获取数据返回?

背景介绍 当我们在接口或UI自动化项目中&#xff0c;常常会出现这种现象——明明是正常请求&#xff0c;却无法获取到想要的数据返回。 比如&#xff1a; 场景A&#xff1a;页面是动态数据&#xff0c;第一次进入页面获取到的数据&#xff0c;和下次进入页面获取到的数据完全…

ASEMI整流桥GBJ2510参数:拆析其关键性能特点

编辑-Z 在众多的电力电子元件中&#xff0c;GBJ2510整流桥以其高效能和可靠性赢得了工业领域的广泛认可。这款设备是在电力系统、直流电源等一系列设备中不可或缺的组件。本文将详细反析GBJ2510整流桥参数的关键性能特点&#xff0c;以帮助用户更加全面地理解和使用这种电子设…

Blender:制作一个变形动画

就是一个球逐渐地变为一个立方体 首先创建一个球和一个立方体 然后把两个物体放在一起&#xff0c;放缩球&#xff0c;让球包含立方体 之后选中球&#xff0c;为其添加修改器&#xff0c;缩裹 在这里选择缩裹对象为立方体 然后在应用下拉箭头中选择“应用为形态键” 下一步选中…

数字格式化

数字格式化 具体实现如下&#xff1a; 定义一个名为 num 的变量&#xff0c;表示需要格式化的数字字符串。使用 replace 函数对 num 变量的值进行替换操作&#xff0c;使用正则表达式 /(?\B(\d{3})$)/g 匹配数字字符串中每个不是开头的三位数字&#xff0c;并在其前面添加一…

尚硅谷Flink(二)DStream API

目录 &#x1f320;不会点 &#x1fa90;DataStream API ​编辑 &#x1f320; 执行环境 创建执行环境 执行模式 触发程序执行 &#x1f320;源算子 准备基础类型 从集合中读取数据 从文件读取数据 从 Socket 读取数据 从 Kafka 读取数据 &#xff08;没学过&#xff09; …

【MATLAB-Retinex图像增强算法的去雾技术】

续&#xff1a;【MATLAB-基于直方图优化的图像去雾技术】 【MATLAB-Retinex图像增强算法的去雾技术】 1 原图2 MATLAB实现代码3 结果图示 参考书籍&#xff1a;计算机视觉与深度学习实战:以MATLAB、Python为工具&#xff0c; 主编&#xff1a;刘衍琦, 詹福宇&#xff0c; 王德建…

【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

文章目录 前言&#xff1a;RestClient 查询文档的 RestAPI一、全文检索查询1.1 match_all 查询1.2 match 查询1.3 multi_match 查询 二、精确查询2.1 term 查询2.2 range 查询 三、复合查询&#xff1a;Boolean 查询与 function score 查询的综合案例四、对查询结果的处理4.1 将…

ArcGIS笔记5_生成栅格文件时保存报错怎么办

本文目录 前言Step 1 直接保存到指定文件夹会报错Step 2 先保存到默认位置再数据导出到指定文件夹 前言 有时生成栅格文件时&#xff0c;保存在自定义指定的文件夹内会提示出错&#xff0c;而保存到默认位置则没有问题。因此可以通过先保存到默认位置&#xff0c;再数据导出到…

C++-标准库 std::pair的三种构造函数

std::pair有三种构造函数形式 pair(const T1& x,const T2& y); pair(U&& x, V&& y); template <typename... Args1, typename... Args2> pair(piecewise_construct_t, tuple<Args1...> first_args,tuple<Args2...> second_args);前…

image标签图片变形

官方提供了自己的方法&#xff0c;只需要给image标签添加mode属性即可&#xff0c;在对应上对应的参数即可完美解决。 语法 <image src"http://cdn.duanqinghua.com/duanqinghua/img/65.jpg" mode"aspectFill"></image> mode的合法值 值说…

android 关于admob聚合applovin的坑

//admob嵌入applovinimplementation com.google.ads.mediation:applovin:11.10.1.0<!--applovin广告相关--> <meta-data android:name"applovin.sdk.key"android:value"922wQKbta1GBIrdDsdJQkPza6l1RfGNcc8paoUR1yvs_GcB6WNqMbB4MR7FkV7MGSpsSykXloJUy…