⼀、 MQ 简介
MQ : MessageQueue ,消息队列。是在互联⽹中使⽤⾮常⼴泛的⼀系列服务中间件。 这个词可以分两个部分来看,⼀是Message :消息。消息是在不同进程之间传递的数据。这些进程可以部署在同⼀台机器上,也可以分布在不同机器上。⼆是Queue :队列。队列原意是指⼀种具有 FIFO( 先进先出 ) 特性的数据结构,是⽤来缓存数据的。对于消息中间件产品来说,能不能保证FIFO 特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能⼒。
⼴义上来说,只要能够实现消息跨进程传输以及队列数据缓存,就可以称之为消息队列。例如我们常⽤的 QQ 、微信、阿⾥旺旺等就都具备了这样的功能。只不过他们对接的使⽤对象是⼈,⽽我们这⾥讨论的MQ 产品需要对接的使⽤对象是应⽤程序。
MQ 的作⽤主要有以下三个⽅⾯:
异步
例⼦:快递员发快递,直接到客户家效率会很低。引⼊菜⻦驿站后,快递员只需要把快递放到菜⻦驿站,就可以继续发其他快递去了。客户再按⾃⼰的时间安排去菜⻦驿站取快递。
作⽤:异步能提⾼系统的响应速度、吞吐量。
· 解耦
例⼦:《 Thinking in JAVA 》很经典,但是都是英⽂,我们看不懂,所以需要编辑社,将⽂章翻译成其他语⾔,这样就可以完成英语与其他语⾔的交流。
作⽤:
1 、服务之间进⾏解耦,才可以减少服务之间的影响。提⾼系统整体的稳定性以及可扩展性。
2 、另外,解耦后可以实现数据分发。⽣产者发送⼀个消息后,可以由⼀个或者多个消费者进⾏消费,并且消费者的增加或者减少对⽣产者没有影响。
· 削峰
例⼦:⻓江每年都会涨⽔,但是下游出⽔⼝的速度是基本稳定的,所以会涨⽔。引⼊三峡⼤坝后,可以把⽔储存起来,下游慢慢排⽔。
作⽤:以稳定的系统资源应对突发的流量冲击。
⼆、 RocketMQ 产品特点
1 、 RocketMQ 介绍
RocketMQ 是阿⾥巴巴开源的⼀个消息中间件,在阿⾥内部历经了双⼗⼀等很多⾼并发场景的考验,能够处理亿万级别的消息。2016 年开源后捐赠给 Apache ,现在是 Apache 的⼀个顶级项⽬。
早期阿⾥使⽤ ActiveMQ ,但是,当消息开始逐渐增多后, ActiveMQ 的 IO 性能很快达到了瓶颈。于是,阿⾥开始关注Kafka 。但是 Kafka 是针对⽇志收集场景设计的,他的⾼级功能并不是很贴合阿⾥的业务场景。尤其当他的Topic过多时,由于 Partition ⽂件也会过多,这就会加⼤⽂件索引的耗时,会严重影响 IO 性能。于是阿⾥才决定⾃研中间件,最早叫做MetaQ ,后来改名成为 RocketMQ 。最早他所希望解决的最⼤问题就是多 Topic 下的 IO 性能压⼒。但是产品在阿⾥内部的不断改进,RocketMQ 开始体现出⼀些不⼀样的优势。
2 、 RocketMQ 特点
当今互联⽹ MQ 产品众多,其中,影响⼒和使⽤范围最⼤的当数 Apache Kafka 、 RabbitMQ 、 Apache RocketMQ以及Apache Plusar 。这⼏⼤产品虽然都是典型的 MQ 产品,但是由于设计和实现上的⼀些差异,造成他们适合于不同的细分场景。
其中 RocketMQ ,孵化⾃阿⾥巴巴。历经阿⾥多年双⼗⼀的严格考验, RocketMQ 可以说是从全世界最严苛的⾼并发场景中摸爬滚打出来的过硬产品,也是少数⼏个在⾦融场景⽐较适⽤的MQ 产品。从横向对⽐来看,RocketMQ与 Kafka 和 RabbitMQ 相⽐。 RocketMQ 的消息吞吐量虽然和 Kafka 相⽐还是稍有差距,但是却⽐RabbitMQ⾼很多。在阿⾥内部, RocketMQ 集群每天处理的请求数超过 5 万亿次,⽀持的核⼼应⽤超过 3000 个。⽽RocketMQ 最⼤的优势就是他天⽣就为⾦融互联⽹⽽⽣。他的消息可靠性相⽐ Kafka 也有了很⼤的提升,⽽消息吞吐量相⽐RabbitMQ 也有很⼤的提升。另外, RocketMQ 的⾼级功能也越来越全⾯,⼴播消费、延迟队列、死信队列等等⾼级功能⼀应俱全,甚⾄某些业务功能⽐如事务消息,已经呈现出领先潮流的趋势。
三、 RocketMQ 快速实战
1 、快速搭建 RocketMQ 服务
RocketMQ 的官⽹地址: http://rocketmq.apache.org 。在下载⻚⾯可以获取 RocketMQ 的源码包以及运⾏包。下载⻚⾯地址: https://rocketmq.apache.org/download 。
当前最新的版本是 5.x ,这是⼀个着眼于云原⽣的新版本,给 RocketMQ 带来了⾮常多很亮眼的新特性。但是⽬前来看,企业中⽤得还⽐较少。因此,我们这⾥采⽤的还是更为稳定的4.9.5 版本。
运⾏只需要下载 Binary 运⾏版本就可以了。 当然,源码包也建议下载下来,后续会进⾏解读。运⾏包下载下来后,就可以直接解压,上传到服务器上。我们这⾥会上传到/app/rocketmq ⽬录。解压后⼏个重要的⽬录如下 :
接下来, RocketMQ 建议的运⾏环境需要⾄少 12G 的内存,这是⽣产环境⽐较理想的资源配置。但是,学习阶段,如果你的服务器没有这么⼤的内存空间,那么就需要做⼀下调整。进⼊bin ⽬录,对其中的 runserver.sh 和runbroker.sh两个脚本进⾏⼀下修改。
使⽤ vi runserver.sh 指令,编辑这个脚本,找到下⾯的⼀⾏配置,调整 Java 进程的内存⼤⼩。
接下来,同样调整 runbroker.sh 中的内存⼤⼩。
调整完成后,就可以启动 RocketMQ 服务了。 RocketMQ 服务基于 Java 开发,所以需要提前安装 JDK 。 JDK 建议采⽤1.8 版本即可。
RocketMQ 的后端服务分为 nameserver 和 broker 两个服务,关于他们的作⽤,后⾯会给你分享。接下来我们先将这两个服务启动起来。
第⼀步:启动 nameserver 服务。
指令执⾏后,会⽣成⼀个 nohup.out 的⽇志⽂件。在这个⽇志⽂件⾥如果看到下⾯这⼀条关键⽇志,就表示nameserver服务启动成功了。
接下来,可以通过 jsp 指令进⾏验证。使⽤ jps 指令后,可以看到有⼀个 NamesrvStartup 的进程运⾏,也表示nameserver服务启动完成。
第⼆步:启动 broker 服务。
启动 broker 服务之前,要做⼀个⼩⼩的配置。进⼊ RocketMQ 安装⽬录下的 conf ⽬录,修改 broker.conf ⽂件,在⽂件最后⾯加⼊⼀个配置:
然后也可以⽤之前的⽅式启动 broker 服务。启动 broker 服务的指令是 mqbroker
启动完成后,同样检查 nohup.out ⽇志⽂件,有如下⼀条关键⽇志,就表示 broker 服务启动正常了。