一、MQ介绍
定义
MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。
作用
异步
作用:
异步能提高系统的响应速度、吞吐量。
解耦
作用:
1、服务之间进行解耦,才可以减少服务之间的影响。提高系统整体的稳定性以及可扩展性。
2、另外,解耦后可以实现数据分发。生产者发送一个消息后,可以由一个或者多个消费者进行消 费,并且消费者的增加或者减少对生产者没有影响。
削峰
作用:
以稳定的系统资源应对突发的流量冲击。
MQ缺点
系统可用性降低
系统引入的外部依赖增多,系统的稳定性就会变差。一旦MQ宕机,对业务会产生影响。这就需要考虑如何保证MQ的高可用。
系统复杂度提高
引入MQ后系统的复杂度会大大提高。以前服务之间可以进行同步的服务调用,引入MQ后,会变为异步调用,数据的链路就会变得更复杂。并且还会带来其他一些问题。比如:如何保证消费不会丢失?不会被重复调用?怎么保证消息的顺序性等问题。
消息一致性问题
A系统处理完业务,通过MQ发送消息给B、C系统进行后续的业务处理。如果B系统处理成功,C系统处理失败怎么办?这就需要考虑如何保证消息数据处理的一致性。
MQ产品比较
常用的MQ产品包括Kafka、RabbitMQ和RocketMQ。我们对这三个产品做下简单的比较,重点需要理解他们的适用场景。
![](https://i-blog.csdnimg.cn/blog_migrate/8be512fef98d4dba6980b3cd548a271c.png)
二、RocketMQ实战
RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验, 能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。
RocketMQ由以下这几个组件组成
NameServer : 提供轻量级的Broker路由服务。
Broker:实际处理消息存储、转发等服务的核心组件。
Producer:消息生产者集群。通常是业务系统中的一个功能模块。
Consumer:消息消费者集群。通常也是业务系统中的一个功能模块。
所以我们要启动RocketMQ服务,需要先启动NameServer。
1、下载RocketMQ 4.7.1版本RocketMQ运行版本下载地址:
https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip
RocketMQ源码版本下载地址: https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.1/r ocketmq-all-4.7.1-source-release.zip
2、快速安装RocketMQ
RocketMQ的安装非常简单,就是上传解压就可以了。
然后我们准备一台CentOS7的Linux机器,快速把RocketMQ给运行起来。我使用的Linux版本如下
我们需要创建一个操作用户用来运行自己的程序,与root用户区分开。使用root用户创建一个oper用户,并给他创建一个工作目录。
运行RocketMQ需要先安装JDK。我们采用目前最稳定的JDK1.8版本。CentOS可以采用课件资料中的jdk-8u171-linux-x64.tar.gz,也可以自行去Oracle官网上下载。然后用FTP上传到oper用户的工作目录下。由oper用户解压到/app/jdk1.8目录下。
配置环境变量。使用 vi ~/.bash_profifile编辑文件,在下面加入以下内容:
![](https://i-blog.csdnimg.cn/blog_migrate/eaf40838f37b1c4f0e19f0174fe1d824.png)
编辑完成后,执行 source ~/.bash_profifile让环境变量生效。输入java -version能查看到以下内容表明JDK安装成功了。
然后我们把下载的rocketmq-all-4.7.1-bin-release.zip在本地完成解压,并上传到/app/rocketmq目
录。完成后,把rocketmq的bin目录也配置到环境变量当中。 vi ~/.bash_profifile,加入以下内容,并执行source ~/.bash_profifile让环境变量生效:
这样RocketMQ就安装完成了。我们把他运行起来。
3、启动NameServer
启动NameServer非常简单, 在$ROCKETMQ_HOME/bin目录下有个mqadminsrv。直接执行这个脚本就可以启动RocketMQ的NameServer服务。
但是要注意,RocketMQ默认预设的JVM内存是4G,这是RocketMQ给我们的最佳配置。但是通常我们用虚拟机的话都是不够4G内存的,所以需要调整下JVM内存大小。修改的方式是直接修改
runserver.sh。 用vi runserver.sh编辑这个脚本,在脚本中找到这一行调整内存大小为512M。
![](https://i-blog.csdnimg.cn/blog_migrate/494387a24285b5a30ad8f024bb40afcc.png)
然后我们用静默启动的方式启动NameServer服务:
![](https://i-blog.csdnimg.cn/blog_migrate/19c393e68b0f8f9b11bd9f631fc4c085.png)
启动完成后,在nohup.out里看到这一条关键日志就是启动成功了。并且使用jps指令可以看到有一个NamesrvStartup进程。
![](https://i-blog.csdnimg.cn/blog_migrate/b1fb3f337d62c81810c169b7e4b2748e.png)
4、 启动Broker
启动Broker的脚本是runbroker.sh。Broker的默认预设内存是8G,启动前,如果内存不够,同样需
要调整下JVM内存。vi runbroker.sh,找到这一行,进行内存调整
![](https://i-blog.csdnimg.cn/blog_migrate/83d516ada6daf28cb3798b62b7a516fb.png)
然后我们需要找到$ROCKETMQ_HOME/conf/broker.conf, vi指令进行编辑,在最下面加入一个配置:
![](https://i-blog.csdnimg.cn/blog_migrate/9e0a9d99be8e34bc68862e4455034903.png)
然后也以静默启动的方式启动runbroker.sh
![](https://i-blog.csdnimg.cn/blog_migrate/48ae6d80d874d1bb2bf5a3683eca413b.png)
启动完成后,同样是检查nohup.out日志,有这一条关键日志就标识启动成功了。 并且jps指令可以
看到一个BrokerStartup进程。
5、 命令行快速验证
在RocketMQ的安装包中,提供了一个tools.sh工具可以用来在命令行快速验证RocketMQ服务。我们在worker2上进入RocketMQ的安装目录:
首先需要配置一个环境变量NAMESRV_ADDR指向我们启动的NameServer服务。
然后启动消息生产者发送消息:默认会发1000条消息
我们可以看到发送消息的日志:
![](https://i-blog.csdnimg.cn/blog_migrate/95e3758adfbb9c50d22bea2a07292563.png)
这日志中,上面部分就是我们发送的消息的内容。后面两句标识消息生产者正常关闭。
然后启动消息消费者接收消息:
![](https://i-blog.csdnimg.cn/blog_migrate/5fb016f542796f367755008c6c40580b.png)
启动后,可以看到消费到的消息。
![](https://i-blog.csdnimg.cn/blog_migrate/59aa2d4a889dbbe8f6cbef1b1f4d0a7b.png)
而这个Consume指令并不会结束,他会继续挂起,等待消费其他的消息。我们可以使用CTRL+C停止该进程。
6、 关闭RocketMQ服务
要关闭RocketMQ服务可以通过mqshutdown脚本直接关闭
![](https://i-blog.csdnimg.cn/blog_migrate/ce9a69cfbaf65733a40ee0b01a70cc95.png)