蚂蚁二面:MQ消费端遇到瓶颈除了横向扩容外还有其他解决办法?

简介: 蚂蚁二面:MQ消费端遇到瓶颈除了横向扩容外还有其他解决办法?

1、面试场景与面试技巧


金三银四招聘季,一位粉丝朋友最近在蚂蚁金服第二轮面试时遇到这样一个问题:如果MQ消费遇到瓶颈时该如何处理?。


横向扩容,相比很多读者与我这位朋友一样会脱口而出,面试官显然不会满意这样的回答,然后追问道:横向扩容是堆机器,还有没有其他办法呢


在面试过程中,个人建议大家在听到问题后稍作思考,不要立马给出太直接的答案,而是应该与面试官进行探讨,一方面可更深刻的理解面试官的出题初衷,同时可以给自己梳理一下思路。


消费端遇到瓶颈,这是一个结果,但引起这个结果的原因是什么呢?在没有弄清楚原因之前谈优化、解决方案都会显得很苍白


在这样的面试场景中,我们该如何探讨交流呢?我的思路如下:


  • 尝试与面试官探讨如何判断消费端遇到瓶颈
  • 如何查找根因
  • 提出解决方案

温馨提示:为了本文观点的严谨性,本文主要以RocketMQ为例进行剖析。

2、如何判断消费端遇到瓶颈


在RocketMQ消费领域中判断消费端遇到瓶颈通常有两个重要的指标:


  • 消息积压数量(延迟数量)
  • lastConsumeTime


在开源版本的控制台rocketmq-console界面中,可以查阅一个消费端上述两个指标,如下图所示:

bb81a6a8c34b70e0a28b8f9331fbb66e.png

  • Delay:消息积压数量,即消费端还剩下多少消息未处理,该值越大,说明消费端遇到瓶颈了
  • LastConsumeTime:表示上一次成功消费的消息的存储时间,该值离当前时间越大,同样能说明消费端遇到瓶颈了


那为什么会积压呢?消费端是在哪遇到瓶颈了呢?


3、如何定位问题


消费端出现瓶颈,如何识别是客户端的问题还是服务端的问题,一个最简单的办法是看集群内其他消费组是否也有积压,特别是和有问题的消费组订阅同一个主题的其他消费组是否有积压,按照笔者的经验,出现消息积压通常是客户端的问题,可以通过查询 rocketmq_client.log加以证明:

grep "flow" rocketmq_client.log

出现so do flow control 这样的日志,说明触发了消费的限流,其直接触发原因:就是消息消费端积压消息,即消费端无法消费已拉取的消息,为了避免内存泄露,RocketMQ在消费端没有将消息处理完成后,不会继续向服务端拉取消息,并打印上述日志。


那如何定位消费端慢在哪呢?是卡在哪行代码呢?


通常的排查方法是跟踪线程栈,即利用jstack命令查看线程运行情况,以此来探究线程的运行情况。


通常使用的命令如下:

ps -ef | grep java
jstack pid > j1.log

通常为了对比,我一般会连续打印5个文件,从而可以在5个文件中查看同一个消费者线程,其状态是否变化,如果未变化,则说明该线程卡主,那就是我们重点需要关注的地方。


在RocketMQ中,消费端线程以ConsumeMessageThread_开头,通过对线程的判断,如下代码让人为之兴奋:

e1fd61f3097a32d938bd3414e9055d88.png


消费端线程的状态是RUNNABLE,但在5个文件中其状态都是一样,基本可以断定线程卡在具体的代码,从示例代码中是卡在掉一个外部的http借口,从而加以解决,通常在涉及外部调用,特别是http调用,可以设置一个超时时间,避免长时间等待。


4、解决方案


其实根据第三步骤,大概率能明确是哪个地方慢,遇到了性能瓶颈,通常无非就是调第三方服务,数据库等问题出现了瓶颈,然后对症下药。数据库等性能优化,并不在本文的讨论范围之内,故这里可以点到为止,当然面试官后续可能会继续聊数据库优化等话题,这样就实现了与面试官的交流互动,一环扣一环,技术交流氛围友好,面试通过率大大提高。


最后,我还想和大家探讨一个问题,出现消息积压就一定意味着遇到消费瓶颈,一定需要处理吗?


其实也不然,我们回想一下为什么需要使用MQ,不就是利用异步解耦与削峰填谷吗?例如在双十一期间,大量突发流量汇入,此时很可能导致消息积压,这正式我们的用意,用MQ抗住突发流量,后端应用慢慢消费,保证消费端的稳定,在积压的情况下,如果tps正常,即问题不大,这个时候通常的处理方式就是横向扩容,尽可能的降低积压,减少业务的延迟。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
消息中间件 运维 UED
消息队列运维实战:攻克消息丢失、重复与积压难题
消息队列(MQ)作为分布式系统中的核心组件,承担着解耦、异步处理和流量削峰等功能。然而,在实际应用中,消息丢失、重复和积压等问题时有发生,严重影响系统的稳定性和数据的一致性。本文将深入探讨这些问题的成因及其解决方案,帮助您在运维过程中有效应对这些挑战。
36 1
|
API 容器 Kubernetes
当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?
作者 | 阿里云容器平台高级技术专家 曾凡松(逐灵) 本文主要介绍阿里巴巴在大规模生产环境中落地 Kubernetes 的过程中,在集群规模上遇到的典型问题以及对应的解决方案,内容包含对 etcd、kube-apiserver、kube-controller 的若干性能及稳定性增强,这些关键的增强是阿里巴巴内部上万节点的 Kubernetes 集群能够平稳支撑 2019 年天猫 618 大促的关键所在。
|
2月前
|
消息中间件 SQL 分布式计算
大数据-74 Kafka 高级特性 稳定性 - 控制器、可靠性 副本复制、失效副本、副本滞后 多图一篇详解
大数据-74 Kafka 高级特性 稳定性 - 控制器、可靠性 副本复制、失效副本、副本滞后 多图一篇详解
29 2
|
4月前
|
消息中间件 Java Kafka
Kafka不重复消费的终极秘籍!解锁幂等性、偏移量、去重神器,让你的数据流稳如老狗,告别数据混乱时代!
【8月更文挑战第24天】Apache Kafka作为一款领先的分布式流处理平台,凭借其卓越的高吞吐量与低延迟特性,在大数据处理领域中占据重要地位。然而,在利用Kafka进行数据处理时,如何有效避免重复消费成为众多开发者关注的焦点。本文深入探讨了Kafka中可能出现重复消费的原因,并提出了四种实用的解决方案:利用消息偏移量手动控制消费进度;启用幂等性生产者确保消息不被重复发送;在消费者端实施去重机制;以及借助Kafka的事务支持实现精确的一次性处理。通过这些方法,开发者可根据不同的应用场景灵活选择最适合的策略,从而保障数据处理的准确性和一致性。
355 9
|
6月前
|
消息中间件 Java Apache
消息队列 MQ产品使用合集之Broker内存瞬间增大一倍一般是什么导致的
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
消息中间件 物联网
EMQ支不支持延迟消息, 如何实现
EMQ 是一个基于 Erlang/OTP 架构的开源物联网消息中间件(MQTT Broker)。目前的 EMQ 版本(截至 2023 年 7 月)不直接支持延迟消息。然而,你可以通过以下方法实现延迟消息的功能:
148 0
|
存储 算法 Java
【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
承接上一篇文章【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)】我们基本上对层级时间轮算法的基本原理有了一定的认识,本章节就从落地的角度进行分析和介绍如何通过Java进行实现一个属于我们自己的时间轮服务组件,最后,在告诉大家一下,其实时间轮的技术是来源于生活中的时钟。
145 1
【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
|
消息中间件 开发框架 NoSQL
【工作中问题解决实践 二】分布式消息并发同步处理方案
【工作中问题解决实践 二】分布式消息并发同步处理方案
129 0
|
缓存 数据挖掘 BI
面试官问你:日亿万级请求日志收集如何不影响主业务?你怎么回复
数据收集 上篇详细讨论了写缓存的架构解决方案,它虽然可以减少数据库写操作的压力,但也存在一些不足。比如需要长期高频插入数据时,这个方案就无法满足,接下来将围绕这个问题逐步提出解决方案。
|
消息中间件 运维 Java
kafka单条消息过大导致线上OOM,运维连夜跑路了!
kafka生产者罢工,停止生产,生产者内存急剧升高,导致程序几次重启。 查看日志,发现Pro程序爆异常kafka.common.MessageSizeTooLargeException。
315 0