当前位置 博文首页 > Shockang的博客:Kafka 积压了百万消息如何处理?

    Shockang的博客:Kafka 积压了百万消息如何处理?

    作者:[db:作者] 时间:2021-08-23 22:11

    前言

    本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

    本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

    正文

    在使用消息队列遇到的问题中,消息积压这个问题,应该是最常遇到的问题之一,并且,这个问题还不太好解决。

    我们都知道,消息积压的直接原因,一定是系统中的某个部分出现了性能问题,来不及处理上游发送的消息,才会导致消息积压。

    所以,我们先来分析下,在使用消息队列时,如何来优化代码的性能,避免出现消息积压。

    然后再来看看,如果你的线上系统出现了消息积压,该如何进行紧急处理,最大程度地避免消息积压对业务的影响。

    最大程度避免消息积压

    生产者:提升吞吐量

    可以参考我的这篇博客——如何提升 Kafka 生产者的吞吐量?

    消费者:扩容,扩分区;增加consumer

    如何处理消息积压

    日常系统正常运转的时候,没有积压或者只有少量积压很快就消费掉了,但是某一个时刻,突然就开始积压消息并且积压持续上涨。

    这种情况下需要你在短时间内找到消息积压的原因,迅速解决问题才不至于影响业务。

    导致突然积压的原因肯定是多种多样的,不同的系统、不同的情况有不同的原因,不能一概而论。

    但是,我们排查消息积压原因,是有一些相对固定而且比较有效的方法的。

    能导致积压突然增加,最粗粒度的原因,只有两种:

    要么是发送变快了,要么是消费变慢了。

    大部分消息队列都内置了监控的功能,只要通过监控数据,很容易确定是哪种原因。

    如果是单位时间发送的消息增多,比如说是赶上大促或者抢购,短时间内不太可能优化消费端的代码来提升消费性能,唯一的方法是通过扩容消费端的实例数来提升总体的消费能力。

    如果短时间内没有足够的服务器资源进行扩容,没办法的办法是,将系统降级,通过关闭一些不重要的业务,减少发送方发送的数据量,最低限度让系统还能正常运转,服务一些重要业务。

    还有一种不太常见的情况,你通过监控发现,无论是发送消息的速度还是消费消息的速度和原来都没什么变化,这时候你需要检查一下你的消费端,是不是消费失败导致的一条消息反复消费这种情况比较多,这种情况也会拖慢整个系统的消费速度。

    如果监控到消费变慢了,你需要检查你的消费实例,分析一下是什么原因导致消费变慢。

    优先检查一下日志是否有大量的消费错误,如果没有错误的话,可以通过打印堆栈信息,看一下你的消费线程是不是卡在什么地方不动了,比如触发了死锁或者卡在等待某些资源上了

    cs