一.MQ概述
1.MQ是什么
MQ全称为Message Queue,即消息队列 ,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生 产、存储、消费全过程的软件系统,遵循FIFO原则。在高并发的分布式系统中使用居多。
2.为什么用MQ
为什么要使用MQ, 我从生活中发现的一个例子来举例说明,即:天府通刷地铁出站的时候不是立马扣费,而是提示“出站成功,费用将会在稍后结算”, 我们假设天府通后台扣费流程如下:
【注意】假如天府通出站API 和 支付系统 是不同的子系统 (两个子系统远程通信)
上下班高峰期使用天府通刷码的人非常多,意味着并发量很高,一个出站请求到后台需要做费用结算,或者积分赠送等业务。由于并发很高,并且费用结算和积分等业务本来就耗时,况且支付服务也不一定能承担那么大的请求量。
当服务器线程耗尽,后续请求会等待变慢,再加上高并发请求就会导致后续请求越来越慢,请求长时间等待,导致大量请求超时。并发太高,可能会导致服务器的内存上升,CPU使用率急速上升,甚至导致服务器宕掉。
解决方案:使用MQ消峰,让请求在MQ中排队,效果如下
加入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哈哈~
技术选型建议:
- 大数据场景,日志收集,实时性要求高,推荐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/
下载后解压
- Bin : 可执行文件目录
- Conif:配置文件目录
- Lib : 依赖库,一堆Jar包
3.2.配置ROCKETMQ_HOME
解压,配置 ROCKETMQ_HOME
3.3.启动RocketMQ
- 启动NameServer: Cmd命令框执行进入至‘MQ文件夹\bin’下,然后执行
start mqnamesrv.cmd
,启动NameServer。
成功后会弹出提示框,此框勿关闭。
- 启动Broker:进入至‘MQ文件夹\bin’下,修改Bean目录下的
runbroker.cmd
中JVM占用内存大小
CMD执行start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
,启动Broker。
成功后会弹出提示框,此框勿关闭
3.4.RocketMQ存储结构[了解]
RabbitMQ安装好之后会在用户目录下产生一个store目录用来存储相关数据:
- 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管理插件
为了方便管理,我们需要安装一个可视化插件
下载插件 :RocketMQ可视化管理插件下载地址:https://github.com/apache/rocketmq-externals/releases
修改配置 :解压后,修改配置:src/main/resource/application.properties 如下: 这里需要指向Name Server 的地址和端口
打包插件 :回到安装目录,执行:
mvn clean package -Dmaven.test.skip=true
,然后会在target目录生成打包后的jar文件启动插件:进入 target 目录,执行
java -jar rocketmq-console-ng-1.0.0.jar
, 访问 http://localhost:8080
文章到这就结束了,点赞还是要求一下的,万一屏幕面前的大帅哥,或者大漂亮一不小心就一键三连了啦,那我就是熬夜到头发掉光,也出下章。