kafka故障排查-consumer处理超时导致的异常

最近遇到一个kafka方面的问题,大致就是由于consumer处理业务超时,导致无法正常提交Offset,进而导致无法消费新消息的问题。下面我想从以下几个方面对此次故障排查进行复盘分析:业务背景、问题描述、排查思路、经验教训。

一、业务背景

先简单描述一下业务背景吧。我们有个业务需要严格按顺序消费Topic消息,所以针对该topic设置了唯一的partition,以及唯一的副本。当同一个消费组的多个consumer启动时,只会有一个consumer订阅到该Topic,进行消费,保证同一个消费组内的消费顺序。
注:消费组的groupId名称为“smart-building-consumer-group”,订阅的Topic名称为“gate_contact_modify”。

二、问题描述

有一天我们突然收到一个问题反馈:producer侧的业务产生消息后,consumer侧并没有得到预期的结果。经过排查,排除了业务逻辑出现问题的可能性,我们判断最有可能是因为kafka消息没有被消费到。为了印证这个猜测,我们查看了consumer消费日志,发现日志中存在这样几处问题:
(1)日志偶尔会打印出一条Kafka的警告日志,内容为:
org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1 org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.maybeAutoCommitOffsetsSync:648 - Auto-commit of offsets {gate_contact_modify-0=OffsetAndMetadata{offset=2801, metadata=‘‘}} failed for group smart-building-consumer-group: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is spending too much time message processing. You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.
(2)接着进行了一次rebalance;
(3)consumer侧输出了Topic消费者的业务日志,表明正常获取到了Topic消息。
接着我们查看kafka 消费组中该Topic对应的Offset的变化情况,发现Offset一直没有变化。

三、排查思路

日志中的异常信息很明确的告知我们,topic消息消费完成后,由于group发生了一次rebalance,导致Commit没有被提交,这表明两次poll消息的间隔时间超过了max.poll.interval.ms定义的最大间隔,这也意味着一次poll后处理消息的过程超时了,正是由于poll间隔时间超时,导致了一次rebalance。同时建议我们要么增加间隔时间,要么减少每次拉取的最大消息数。
另外,由于Commit没有被提交,导致OffSet值没有变化,那么每次拉取到的消息都是同一批重复消息。具体的异常流程如下图:

根据上述信息,我们进一步检查了consumer的max.poll.records配置、max.poll.interval.ms配置,并统计了每条Topic消息的处理耗时,发现max.poll.records使用了默认配置值500,max.poll.interval.ms使用了默认配置值为300s,而每条Topic消息的处理耗时为10S。这进一步证实了我们的推论:
由于每次拉取的消息数太多,而每条消息处理时间又较长,导致每次消息处理时间超过了拉取时间间隔,从而使得group进行了一次rebalance,导致commit失败,并最终导致下次拉取重复的消息、继续处理超时,进入一个死循环状态。
知道问题根源后,我们结合业务特点,更改了max.poll.records=1,每次仅拉取一条消息进行处理,最终解决了这个问题。

四、经验教训

这次故障排查,使我们对Kafka消息poll机制、rebalance和commit之间的相互影响等有了更深的理解。
(1)kafka每次poll可以指定批量消息数,以提高消费效率,但批量的大小要结合poll间隔超时时间和每条消息的处理时间进行权衡;
(2)一旦两次poll的间隔时间超过阈值,group会认为当前consumer可能存在故障点,会触发一次rebalance,重新分配Topic的partition;
(3)如果在commit之前进行了一次rebalance,那么本次commit将会失败,下次poll会拉取到旧的数据(重复消费),因此要保证好消息处理的幂等性;

原文地址:https://blog.51cto.com/andrewli/2440857

时间: 2024-10-09 23:12:00

kafka故障排查-consumer处理超时导致的异常的相关文章

故障排查:是什么 导致了客户端批量心跳超时掉线

心跳超时指的是:针对某个在线的客户端(TCP连接),服务端在指定的时间内,没有收到来自该客户端的任何消息,则认为该客户端已经掉线. 为什么需要心跳机制了?因为针对某些客户端掉线(可能是因为网络断开.或客户端程序退出),服务端不能立即感受到(有的可能需要过很长的时间才能感受到),所以,需要引入心跳机制,让服务端尽可能早地发现客户端已经不在线了.关于心跳机制,更详细的介绍可以参见这里. 如果发生了很多客户端批量心跳超时掉线的情况,就说明服务端在过去的某段时间内,从未收到来自这些客户端的任何心跳消息.

故障排查:是什么 导致了服务器端口telnet失败?

telnet命令的主要作用是与目标端口进行TCP连接(即完成TCP三次握手). 当服务端启动后,但是telnet其监听的端口,却失败了.或者,当服务端运行了一段时间后,突然其监听的端口telnet不通了.当类似这样的telnet失败的情况出现时,都可以按照如下方面进行排查: 1.观察一下服务端进程的CPU和内存是否有异常. 比如,当CPU持续在100%时,就有可能导致来自客户端的TCP连接请求被丢弃或无暇处理. 2.端口监听器是否运行正常? 可以通过IRapidServerEngine的Adva

故障排查:是什么 导致了服务器端口telnet失败?(转)

telnet命令的主要作用是与目标端口进行TCP连接(即完成TCP三次握手).当服务端启动后,但是telnet其监听的端口,却失败了.或者,当服务端运行了一段时间后,突然其监听的端口telnet不通了.当类似这样的telnet失败的情况出现时,都可以按照如下方面进行排查: 1.观察一下服务端进程的CPU和内存是否有异常. 比如,当CPU持续在100%时,就有可能导致来自客户端的TCP连接请求被丢弃或无暇处理.  2.端口监听器是否运行正常? 可以通过IRapidServerEngine的Adva

ceph 集群报 mds cluster is degraded 故障排查

ceph 集群版本: ceph -vceph version 10.2.7 (50e863e0f4bc8f4b9e31156de690d765af245185) ceph -w 查看服务状态: mds cluster is degraded      monmap e1: 3 mons at {ceph-6-11=172.16.6.11:6789/0,ceph-6-12=172.16.6.12:6789/0,ceph-6-13=172.16.6.13:6789/0}             el

SQL Server 2008性能故障排查(三)——I/O

原文:SQL Server 2008性能故障排查(三)--I/O 接着上一章:CPU瓶颈 I/O瓶颈(I/O Bottlenecks): SQLServer的性能严重依赖I/O子系统.除非你的数据库完全加载到物理内存中,否则SQLServer会不断地把数据库文件从缓存池中搬进搬出,这会引起大量的I/O传输.同样地,日志记录在事务被声明为已提交前必须写入磁盘.最后,SQLServer基于许多原因使用tempdb,比如存储临时结果.排序和保持行版本.所以一个好的I/O子系统是SQLServer性能关

golang 服务诡异499、504网络故障排查

事故经过 排查 总结 事故经过 11-01 12:00 中午午饭期间,手机突然收到业务网关非200异常报警,平时也会有一些少量499或者网络抖动问题触发报警,但是很快就会恢复(目前配置的报警阈值是5%,阈值跟当时的采样窗口qps有直接关系). 报警当时非200占比已经过10%并且在持续升高,根据历史规律应该很快就会恢复,我们稍微观察了几分钟(一边吃着很香的饺子一边看着手机),但是过了几分钟故障没有恢复而且占比升高了突破50%,故障逐渐升级(故障如果不在固定时间内解决会逐渐升级,故障群每次升级都会

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为很多应用要解析到本地.oracle没有这个解析可能启动不了. 2.注释掉UUID以及MAC地址,需要绑定网卡的时候,这个可能会有影响. 3.磁盘满了无法启动,  var下木有空间,无法创创建PID等文件,导致文件无法启动,按e   进入single  然后b  重启进入单用户模式. 4.ssh登陆系

公司突然断网故障排查

记一次公司断网故障排查 本来大周一挺好的,刚坐在工位上不到半个小时,公司突然断网,此时,我是有点凌乱的! 下边是排查故障的过程 1,首先我看下本机电脑的IP地址,禁用启动,发现仍旧可以获取到IP地址,这代表DHCP分发是没问题的,因为是突然断网,代表着交换机路由器配置不可能出问题 2,接着我带着笔记本进入机房,看了下光猫,光猫状态正常,然后看了下路由器,路由器是H3C的,有web管理界面,进入web管理界面,发现IP地址状态也是正常的. 4,接着给公司网络运营商打电话,他说是他们那边的问题,有个

MPLS VPN 故障排查详解—Yeslab 彭Sir笔记

Technorati 标签: CCIE,MPLS VPN,故障排查,troubleshooting,MPLS Troubleshooting主要从两个层面来进行: 1, 控制层面---路由(和LDP,CEF没有关系) 控制平面主要管的事情是CE之间能通过MPLS VPN相互能学习到路由. No.1 : CE和CE之间,检查路由相互之间是否学习到. 在图中是R10和R2. 如果R10上面没有通过R8学习到对端R2的CE路由. No.2 : 这个时候需要到R1的vrf路由表查询是否有学习到R2的路由