1、面试场景与面试技巧

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

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

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

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

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

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

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

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

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

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

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

  • 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_开头,通过对线程的判断,如下代码让人为之兴奋:

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

4、解决方案

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

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

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

本文就介绍到这里了。如果大家对RocketMQ感兴趣,可以在CSDN上免费下载由阿里巴巴根据我公众号中RocketMQ专栏整理的电子书:

下载链接:RocketMQ电子书下载链接

剥丝抽茧|阿里面试题解读:MQ消费端遇到瓶颈该怎么办?相关推荐

  1. java如何保证mq一定被消费_消费端如何保证消息队列MQ的有序消费

    消息无序产生的原因 消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端(Consumer) ...

  2. mq补偿机制java代码_RocketMQ源码分析之消息消费机制-消费端消息负载均衡机制与重新分布 - Java 技术驿站-Java 技术驿站...

    1.消息消费需要解决的问题 首先再次重复啰嗦一下RocketMQ消息消费的一些基本元素的关系 主题 ---> 消息队列(MessageQueue) 1 对多 主题 ----> 消息生产者, ...

  3. RocketMQ 消费端限流

    RocketMQ 消费端限流 RocketMQ 消费端限流 首先我们要明白为什么需要限流?如果不使用限流呢? 通常情况下,当客户端生产的消息很多时,消费者消费消息速度低于生产者消费速度,我们该如何解决 ...

  4. 抖音、腾讯、阿里、美团春招服务端开发岗位硬核面试(二)

    在上一篇 文章中,我们分享了几大互联网公司面试的题目,本文就来详细分析面试题答案以及复习参考和整理的面试资料,小民同学的私藏珍品????. 首先是面试题答案公布,在讲解时我们主要分成如下几块:语言的基 ...

  5. RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)

    说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施, ...

  6. RocketMQ:消费端的消息消息队列负载均衡与重新发布机制源码解析

    文章目录 前言 流程解析 总结 前言 在上一篇博客中我们了解到,PullMessageService线程主要是负责从pullRequestQueue中获得拉取消息请求并进行请求处理的. PullMes ...

  7. 程序员过关斩将--真的可以用版本号的方式来保证MQ消费消息的幂等性?

    灵魂拷问 MQ消息的消费为什么有时候要求幂等性? 你们都说可以用版本号来解决幂等性消费? 什么才是消息幂等性消费的根本性问题? 随着系统的复杂性不断增加,多数系统都会引入MQ来进行解耦,其实从引入MQ ...

  8. 消息中间件--RabbitMQ --- 消费端限流 -- 非常重要

    什么是消费端的·限流? 假设一个场景,首先,我们Rabbitmq服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面的情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理 ...

  9. 保证MQ消费消息的幂等性,真可以用版本号的方式?

    作者 | 菜v菜 来源 | 架构师修行之路(ID:jiagoushixiuxing) 头图 |  CSDN 下载自东方IC 灵魂拷问 MQ消息的消费为什么有时候要求幂等性? 你们都说可以用版本号来解决 ...

  10. mq消费的几种方式(从消费者角度出发)

    从消费者的角度出发,分析一下消息消费的两种方式: push方式 pull方式 push方式 消息消费的过程: 1. mq接收到消息 2. mq主动将消息推送给消费者(消费者需提供一个消费接口) mq属 ...

最新文章

  1. OpenCV学习笔记(十一)(十二)(十三)(十四)(十五)
  2. 会计证考试《财经法规与职业道德》第三章精选题
  3. 开源一个爬取redmine数据的测试报告系统
  4. Navicat的快捷键
  5. ZooKeeper集群部署方式
  6. Qt:使用元对象编辑器Moc
  7. Linux使用技巧5--格式化U盘
  8. Android仿网络直播弹幕功能的实现
  9. WinHex(16进制编辑器)
  10. 笔记本电脑用久了卡顿解决方法
  11. C#减少图片文件大小和尺寸(转)
  12. mysql threads create_MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图...
  13. SAP HANA是什么 和SAP Fiori 是什么
  14. 联和创“芯”,广东联通积极打造物联网生态圈
  15. WindowsPhone-GameBoy模拟器开发五--使用XNA初略实现Gameboy显示系统
  16. 小米手环4怎么使用_小米手环4如何使用 小米手环4怎么开机
  17. 苹果手机之间怎么传照片_相机与手机之间传送RAW格式照片问题!
  18. 如何写好部门工作总结
  19. Worldwind配置文档
  20. 金色多边形欧美融资商业计划书ppt模板素材

热门文章

  1. 2014年3月份全国计算机等级考试二级c语言选择题大全,2014年3月全国计算机二级C选择题考试真题...
  2. 多网卡时如何使用源地址ping目的地址,检测网络连通性。
  3. 阿里云服务器租用价格表,阿里云服务器优惠
  4. 39岁java程序员,失业中,看不到希望,很迷茫,路在何方?
  5. Unity LOD-Level of Detail(多层次细节)用法教程
  6. 超实用的pr视频制作视频过渡小技巧
  7. ubuntu系统瘦身-清理系统垃圾文件
  8. J-Link软件和文档包的版本发行说明(4)[V6.50 ~ V6.90a版本]
  9. LANP 环境搭建,git配置,ftp配置等
  10. matlab仿真放入直流电源,用Matlab/Simulink软件包建模电容滤波直流电源