美文网首页
线上消息堆积与感想

线上消息堆积与感想

作者: 赵信信官属 | 来源:发表于2021-04-26 23:15 被阅读0次

【环境介绍】
1.应用服务器部署在阿里云
2.消息中间件使用阿里云RocketMQ

前两天线上发生了MQ消息堆积的情况,在我的知识认知里,消息堆积的原因是消费者消费能力差,无法及时消费消息,才会导致消息堆积.
那么有哪些因素会导致消费者消费能力差呢? 我目前的理解有三种情况
1.Dubbo的RPC调用时间太久
2.查询数据库或者插入数据太久
3.业务中还有其他耗时操作,比如发送邮件

记得以前看博客的时候,似乎看到过说发送邮件耗时久导致消息堆积的情况, 而现在就发生在自己身上,真是冥冥之中自有安排.

发生消息堆积,查看阿里云上的线程堆栈信息,如下

图片.png

从线程堆栈上来看,线程在发送邮件,准确说在连接. 根据代码分析以及一段时间的观察线程,断定就是发送邮件的逻辑导致的.临时注释掉这段代码,重新发布,问题解决.

其实发送邮件并不会耗时太久, 而根据阿里云ARMS上的错误显示,消息消费失败总耗时2min. 为什么发送邮件(准确说是连接)会这么久. 因为那段发送邮件的代码在本地测试,只耗时1s左右.

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    try {
        // 配置仅为了文章说明,并不是真实配置
        Mail mail = new Mail("xyz@qq.com", "password");
        mail.addToAddress(Mail.ReceiveType.TO, "opq@qq.com");
        mail.setMailInfo(Mail.Mode.TEXT_MAIL, "这是测试数据", "这是测试数据");
        mail.send();
    } catch (Throwable e) {
        System.out.println(e.getMessage());
    }
    long end = System.currentTimeMillis();

    System.out.println(end - start);
}

我把上面的代码在线上机器测试,发现耗时的确在2min. 为了描述, 我这里以我自己的阿里云服务器做演示.

图片.png

测试了两次,耗时都在1min. 接下来通过strace命令查看系统调用, 看下具体耗时在哪个系统调用上.

关于如何使用strace命令查看系统调用,在我之前的文章中也有过一些介绍

图片.png

邮件发送默认使用25号端口,搜索下关键字25
grep -iE 'connect.25' strace

图片.png

在连接邮件服务器25号端口的时候,超时了.

为什么本地耗时1s, 而在阿里云上的机器就耗时这么久呢? 原因只要一个

图片.png

阿里云默认禁用了25号端口,所以导致连接超时.

在本次事件中,还发现一个情况

图片.png

消息已经消费成功,可是MQ Broker依然投递消息. 简单咨询了阿里云客服,也没给我个具体原因.

请回答
常见消费者消费慢的因素有哪些?
消费慢的时候,要查看下线程堆栈,观察线程都在干啥
你会使用strace命令查看系统调用吗?

图片.png

如上图,目前给我的感觉,作为一个Java码农或者工程师,系统上应该要对以上四个都要熟悉.
你不仅要会使用Java层面的Map,Thread,AQS等等, 当它调用到native方法时候,你还要去JVM层面追踪查看具体的实现,JVM层面可是C或者C++语言. 还有它最终调用到的系统调用是哪个. 而绝大多数人都停留在Java层面,当然这个层面达到精通也很难. 了解JVM的更少了, 能够继续向下了解C和Linux的那就凤毛麟角了.

你掌握的技术,一个刚毕业的学生在2个月或者半年就掌握了,但是别人掌握的知识,你未必在1-2年能掌握. 这或许就是人与人之间的区别. 你是哪种人呢?

相关文章

  • 线上消息堆积与感想

    【环境介绍】1.应用服务器部署在阿里云2.消息中间件使用阿里云RocketMQ 前两天线上发生了MQ消息堆积的情况...

  • Kafka线上消息堆积问题

    一、已知 二、猜测 首先定位到代码如下: 1.首先排查是否代码有更新看git提交记录,发现代码最近一次更新是在20...

  • kafka 消息堆积解决

    一 :背景 线上kafka消费端因日志异常的解决导致消息堆积。 二 : 日志异常解决导致消息堆积 线上kafka消...

  • 精进消息中间件原理系列(一):之消息堆积

    消息堆积 [TOC] 一、消息堆积主要原因 消息堆积主要原因: 1、生产者的生产消息速度>>消费者的处理消息速度,...

  • rocketMq的消息堆积

    概述 这篇文章的目的主要是为了讲清楚rocketMq消息堆积的概念,我印象中的rocketMq的消息堆积应该分为两...

  • 消息堆积问题排查

    背景 我们有一个类似于消息中间件的产品,会将数据push给下游业务系统消费。业务系统可以通过我们的sdk获取消息,...

  • 【RabbitMQ-14】老程序员手把手带你处理消息堆积

    线上高峰期会出现消息堆积吗 压测环境下出现消费堆积怎么解决2.1 消费者数量少2.2 消费者数量不少,压力在机器C...

  • RocketMQ简单介绍

    一、简介 RocketMQ是阿里开源的一款分布式消息中间件,满足线上海量消息堆积的需求, 在2016年底捐赠给Ap...

  • 消息队列 - 消息的堆积解决思路

    学习完整课程请移步 互联网 Java 全栈工程师 如果还没开始投入使用 Kafka,那应该在设计分区数的时候,尽量...

  • 消息队列产生严重消息堆积怎么处理?

    1. 为什么产生消息堆积? 大多是因为 Consumer 出问题了,没有及时发现,或者故障恢复需要较长的时间,导致...

网友评论

      本文标题:线上消息堆积与感想

      本文链接:https://www.haomeiwen.com/subject/yuhyrltx.html