2018年05月31日 13:26:59 xiaoguozi0218 阅读数:2018更多

个人分类: 大数据
 

年后上线的系统,与其他业务系统的通信方式采用了第三代消息系统中间件Kafka。由于是第一次使用,踩了很多坑,通过这篇博客和大家分享一下,也算是做个总结,以便以后温故而知新。

一、线上问题

系统平稳运行两个多月,基本上没有问题,知道最近几天,突然出现Kafka手动提交失败,堆栈信息如下:

通过堆栈信息可以看出,有两个重要参数: session.timeout  和 max.poll.records

session.timeout.ms : 在使用Kafka的团队管理设施时,用于检测消费者失败的超时时间。消费者定期发送心跳来向经纪人表明其活跃度。如果代理在该会话超时到期之前没有收到心跳,那么代理将从该组中删除该消费者并启动重新平衡。

max.poll.records : 在一次调用poll()中返回的最大记录数。

根据堆栈的提示,他让增加 session.timeout.ms 时间 或者 减少 max.poll.records。

二、解决过程

然后我琢磨,上线两个月都没有问题,为什么最近突然出现问题了。我想肯定是业务系统有什么动作,我就去问了一个下,果然头一天风控系统kafka挂掉了,并进行了数据重推,导致了数据阻塞。但是我又想即使阻塞了也会慢慢消费掉牙,不应该报错呀。后来我看了一下kafka官网上的参数介绍,发现max.poll.records默认是2147483647 (0.10.0.1版本),也就是kafka里面有多少poll多少,如果消费者拿到的这些数据在制定时间内消费不完,就会手动提交失败,数据就会回滚到kafka中,会发生重复消费的情况。如此循环,数据就会越堆越多。后来咨询了公司的kafka大神,他说我的kafka版本跟他的集群版本不一样让我升级kafka版本。于是我就升级到了0.10.2.1,查阅官网发现这个版本的max.poll.records默认是500,可能kafka开发团队也意识到了这个问题。并且这个版本多了一个max.poll.interval.ms这个参数,默认是300s。这个参数的大概意思就是kafka消费者在一次poll内,业务处理时间不能超过这个时间。后来升级了kafka版本,把max.poll.records改成了50个之后,上了一次线,准备观察一下。上完线已经晚上9点了,于是就打卡回家了,明天看结果。第二天早起满心欢喜准备看结果,以为会解决这个问题,谁曾想还是堆积。我的天,思来想去,也想不出哪里有问题。于是就把处理各个业务的代码前后执行时间打印出来看一下,添加代码,提交上线。然后观察结果,发现大部分时间都用在数据库IO上了,并且执行时间很慢,大部分都是2s。于是想可能刚上线的时候数据量比较小,查询比较快,现在数据量大了,就比较慢了。当时脑子里第一想法就是看了一下常用查询字段有没有添加索引,一看没有,然后马上添加索引。加完索引观察了一下,处理速度提高了好几倍。虽然单条业务处理的快乐, 但是堆积还存在,后来发现,业务系统大概1s推送3、4条数据,但是我kafka现在是单线程消费,速度大概也是这么多。再加上之前的堆积,所以消费还是很慢。于是业务改成多线程消费,利用线程池,开启了10个线程,上线观察。几分钟就消费完了。大功告成,此时此刻,心里舒坦了好多。不容易呀!

总结:

1、 使用Kafka时,消费者每次poll的数据业务处理时间不能超过kafka的max.poll.interval.ms,该参数在kafka0.10.2.1中的默认值是300s,所以要综合业务处理时间和每次poll的数据数量。

2、Java线程池大小的选择,

对于CPU密集型应用,也就是计算密集型,线程池大小应该设置为CPU核数+1;

对于IO密集型应用 ,线程池大小设置为    2*CPU核数+1.

记一次线上Kafka消息堆积踩坑总结的更多相关文章

  1. 线上kafka消息堆积,consumer掉线,怎么办?

    线上kafka消息堆积,所有consumer全部掉线,到底怎么回事? 最近处理了一次线上故障,具体故障表现就是kafka某个topic消息堆积,这个topic的相关consumer全部掉线. 整体排查 ...

  2. 线上Kafka突发rebalance异常,如何快速解决?

    文章首发于[陈树义的博客],点击跳转到原文<线上Kafka突发rebalance异常,如何快速解决?> Kafka 是我们最常用的消息队列,它那几万.甚至几十万的处理速度让我们为之欣喜若狂 ...

  3. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  4. 解Bug之路-记一次线上请求偶尔变慢的排查

    解Bug之路-记一次线上请求偶尔变慢的排查 前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均 ...

  5. 记一次线上coredump事故

    1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发生在业务低峰期,而且该模块提供的功能也不是核心流程功能,所以对线上业务影响比较小.发生coredump后,运维收到 ...

  6. 记一次线上dubbo服务超时和线程池满问题排查

    线上某dubbo服务A调用dubbo服务B的接口X方法,调用端A日志中出现了很多超时的情况,提供端B该接口X超时时间设置为60s: 查看提供端B的日志,报了很多线程池满的异常: Caused by: ...

  7. 一次 kafka 消息堆积问题排查

    收到某业务组的小伙伴发来的反馈,具体问题如下: 项目中某 kafka 消息组消费特别慢,有时候在 kafka-manager 控制台看到有些消费者已被踢出消费组. 从服务端日志看到如下信息: 该消费组 ...

  8. 记一次线上Curator使用过程JVM栈溢出解决

       为了同学们看起来一目了,特按如下思路进行讲解. 1.出现的场景    2.分析及解决的过程    3.总结 最近公司要使用zookeeper做配置管理(后面简称ZK),然后自己就提前用虚拟机进行 ...

  9. 记一次线上事故的JVM内存学习

    今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...

随机推荐

  1. 推荐9款使用CSS3实现的超酷动画效果

    大家都知道,在网页制作时使用CSS技术,可以有效地对页面的布局.字体.颜色.背景和其它效果实现更加精确的控制.只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,或者页数不同的网页的外观和 ...

  2. asp与aspx有什么区别

    asp与aspx哪个好? 最佳答案 你如果想知道哪个好,我想很多人第一个想法就是aspx好. 这很好理解,就像楼上的朋友说的,aspx是asp的升级版. 但是aspx相对于asp的升级可以说是从根本上 ...

  3. STL - C++ 11的Lambda表达式(上)

    Lambda始自C++ 11,是一种在表达式或语句内指定函数行为的定义式. 你可以定义函数行为作为对象,以inline实参的形式传给算法作为predicate(判断式). eg: std:transf ...

  4. STL - vector algorithm

    // create vector with elements from 1 to 6 in arbitrary order vector<, , , , , }; // find and pri ...

  5. it-tidalwave-semantic-aux-1.0.13.jar下载

    今天来给大家分一下一下自己认为还是挺不错的jar包下载网址,it-tidalwave-semantic-aux-1.0.13.jar,作为java开发人员可能时时刻刻都在跟jar包打交道,即使这会用不 ...

  6. InnerHtml() 与html( )的区别

    InnerHtml() 与html( )的区别 在一个 HTML 文档中, 我们可以使用 .html() 方法来获取任意一个元素的内容. 如果选择器匹配多于一个的元素,那么只有第一个匹配元素的 HTM ...

  7. android基础-Apk打包过程(了解)

    此文来源于<Android软件安全与逆向分析> 一.打包资料文件,生成R.java文件. 二.处理aidl文件,生成相应的Java文件. 三.编译工程源代码,生成相应的class文件. 四 ...

  8. 【Oracle】在win10上安装Oracle客户端报错:[INS-13001]环境不满足最低要求

    环境:win10 64bit 客户端工具: 安装的时候报错: 解决方案: 在\client\stage\cvu目录下找到如下两个文件: 编辑这两个文件,在文件中分别添加如下内容 <OPERATI ...

  9. adb--monkey 压力测试工

    android压力测试命令monkey详解 http://www.jb51.net/article/48557.htm 作者: 字体:[增加 减小] 类型:转载 这篇文章主要介绍了android mo ...

  10. 【HTML入门】Html中块状元素和内联元素解析

    [HTML入门]Html中块状元素和内联元素解析 块元素(block element)一般是其他元素的容器元素,块元素一般都从新行开始,它可以容纳内联元素和其他块元素,内联元素(inline elem ...