2024-01-19  阅读(1)
原文作者: 墨家巨子@俏如来 原文地址:https://blog.csdn.net/u014494148/article/details/119903035

前言

最近挺忙的,好久没更新文章了,最近在搞RocketMQ,那就先发点这个,Netty的文章等我空了再继续更。

一.MQ概述

1.MQ是什么

MQ全称为Message Queue,即消息队列 ,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生 产、存储、消费全过程的软件系统,遵循FIFO原则。在高并发的分布式系统中使用居多。

2.为什么用MQ

为什么要使用MQ, 我从生活中发现的一个例子来举例说明,即:天府通刷地铁出站的时候不是立马扣费,而是提示“出站成功,费用将会在稍后结算”, 我们假设天府通后台扣费流程如下:

202401191955264571.png
【注意】假如天府通出站API 和 支付系统 是不同的子系统 (两个子系统远程通信)

上下班高峰期使用天府通刷码的人非常多,意味着并发量很高,一个出站请求到后台需要做费用结算,或者积分赠送等业务。由于并发很高,并且费用结算和积分等业务本来就耗时,况且支付服务也不一定能承担那么大的请求量。

当服务器线程耗尽,后续请求会等待变慢,再加上高并发请求就会导致后续请求越来越慢,请求长时间等待,导致大量请求超时。并发太高,可能会导致服务器的内存上升,CPU使用率急速上升,甚至导致服务器宕掉。

解决方案:使用MQ消峰,让请求在MQ中排队,效果如下

202401191955269542.png

加入MQ后的效果

  • 高并发请求在MQ中排队,达到了消除峰值的目的,不会有大量的请求同时怼到支付系统
  • 服务异步调用,“天府通出站API” 把结算消息放入MQ就可以返回“出站成功,费用稍后结算”给用户,响应时间很快
  • 服务彻底解耦,即使支付服务挂掉,也不影响“天府通出站API”正常工作,当支付系统再启动仍然可以继续消费MQ中的消息。

3.MQ的使用场景

  • 限流削峰

    MQ可以将系统的超量请求暂存其中,以便系统后期可以慢慢进行处理,从而避免了请求的丢失或系统 被压垮。

  • 服务解耦

    上游系统对下游系统的调用若为同步调用,则会大大降低系统的吞吐量与并发度,且系统耦合度太高。 而异步调用则会解决这些问题。所以两层之间若要实现由同步到异步的转化,一般性做法就是,在这两层间添加一个MQ层。 即使消费者挂掉也不影响生产者工作,只要把消息放入队列即可,消费者重启后自己消费即可。

  • 数据收集

    通过MQ实现数据的收集,如:业务日志、监控数据、用户行为等

  • 大数据处理

    比如我们的平台向“三方平台”获取数据,一次请求了大量数据回来要进行处理,由于数据较多处理不过来,那么就可以放入MQ,再创建一些消费者进行数据处理即可。

4.常见的MQ产品

  • ActiveMQ
    ActiveMQ是使用Java语言开发一款MQ产品。早期很多公司与项目中都在使用。但现在的社区活跃度已经很低。现在的项目中已经很少使用了。
  • RabbitMQ
    RabbitMQ是使用ErLang语言开发的一款MQ产品,性能还是挺高的。但是其吞吐量较Kafka与RocketMQ要低,且由于其不是 Java语言开发,所以公司内部对其实现定制化开发难度较大。
  • Kafka
    Kafka是使用Scala/Java语言开发的一款MQ产品。其最大的特点就是高吞吐率,常用于大数据领域的实 时计算、日志采集等场景。其没有遵循任何常见的MQ协议,而是使用自研协议。对于Spring Cloud Netç ix,其仅支持RabbitMQ与Kafka。
  • RocketMQ
    RocketMQ是使用Java语言开发的一款MQ产品。经过数年阿里双11的考验,性能与稳定性非常高。其 没有遵循任何常见的MQ协议,而是使用自研协议。

【PS】偷来的图O(∩_∩)O哈哈~

202401191955273643.png

技术选型建议:

  • 大数据场景,日志收集,实时性要求高,推荐Kafka
  • 金融领域,不能接受消息丢失或重复,推荐使用RocketMQ
  • 其他情况可以选择RabbitMQ

一.RocketMQ认识与安装

1.RocketMQ是什么

RocketMQ是一个统一消息引擎、轻量级数据处理平台。 RocketMQ是⼀款阿⾥巴巴开源的消息中间件,双十一承载了万亿级消息的流转,2016年11⽉,阿⾥巴巴向 Apache 软件基⾦会捐赠 RocketMQ,成为 Apache 孵化项⽬,2017 年 9 ⽉ ,Apache 宣布 RocketMQ孵化成为 Apache 顶级项⽬(TLP )成为国内⾸个互联⽹中间件在 Apache 上的顶级项⽬。官网:https://github.com/apache/rocketmq/tree/master/docs/cn

2.RocketMQ的特征

  • 支持集群模型、负载均衡、水平扩展能力
  • 亿级别消息堆积能力
  • 采用零拷贝的原理,顺序写盘,随机读
  • 底层通信框架采用Netty NIO
  • 消息失败重试机制、消息可查询
  • 强调集群无单点,可扩展,任意一点高可用,水平可扩展
  • 经过多次双十一的考验

3.RocketMQ的安装[windows]

3.1.下载RocketMQ

下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/

202401191955280224.png

下载后解压

202401191955284815.png

  • Bin : 可执行文件目录
  • Conif:配置文件目录
  • Lib : 依赖库,一堆Jar包

3.2.配置ROCKETMQ_HOME

解压,配置 ROCKETMQ_HOME

202401191955288256.png

3.3.启动RocketMQ

  1. 启动NameServer: Cmd命令框执行进入至‘MQ文件夹\bin’下,然后执行 start mqnamesrv.cmd,启动NameServer。

    202401191955292127.png
    成功后会弹出提示框,此框勿关闭。

    202401191955295598.png

  2. 启动Broker:进入至‘MQ文件夹\bin’下,修改Bean目录下的runbroker.cmd 中JVM占用内存大小

    202401191955299639.png
    CMD执行start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true ,启动Broker。

    2024011919553043210.png
    成功后会弹出提示框,此框勿关闭

    2024011919553070811.png

3.4.RocketMQ存储结构[了解]

RabbitMQ安装好之后会在用户目录下产生一个store目录用来存储相关数据:

2024011919553112212.png

  • Commitlog : 消息是存储写在commitlog目录中,一mapperdFile文件顺序存储消息。
  • Config : 存放运行期间的配置文件
  • Consumerqueue : 该目录中存放的是队列,consume queue存放着commitlog中的消息的索引位置
  • Index :存放着消息索引文件 indexFile,用来实现根据key进行消息的快速查询
  • Abort : 该文件在broker启动后自动创建,正常关闭abort会消失
  • Checkpoint :记录 Commitlog ,Consumerqueue 和index 文件的最后刷盘时间戳

RocketMQ数据存储在磁盘会影响性能吗?不会,RocketMQ的性能在所有的MQ中是比较高的,主要是因为RocketMQ使用了mmap零拷贝技术,consumequeue中的数据是顺序存放的,还引入了PageCache的预读取机制,使得对 consumequeue文件的读取几乎接近于内存读取,即使在有消息堆积情况下也不会影响性能。

3.5.RocketMQ管理插件

为了方便管理,我们需要安装一个可视化插件

  1. 下载插件 :RocketMQ可视化管理插件下载地址:https://github.com/apache/rocketmq-externals/releases

    2024011919553149113.png

  2. 修改配置 :解压后,修改配置:src/main/resource/application.properties 如下: 这里需要指向Name Server 的地址和端口

    2024011919553179214.png

  3. 打包插件 :回到安装目录,执行: mvn clean package -Dmaven.test.skip=true ,然后会在target目录生成打包后的jar文件

    2024011919553230115.png

  4. 启动插件:进入 target 目录,执行 java -jar rocketmq-console-ng-1.0.0.jar , 访问 http://localhost:8080

    2024011919553281316.png

文章到这就结束了,点赞还是要求一下的,万一屏幕面前的大帅哥,或者大漂亮一不小心就一键三连了啦,那我就是熬夜到头发掉光,也出下章。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文