RocketMQ介绍及Linux环境搭建

548 阅读6分钟

一、RocketMQ介绍

​ RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。

​ 目前RocketMQ在阿里云上有一个购买即可用的商业版本,商业版本集成了阿里内部一些更深层次的功能及运维定制。我们这里学习的是Apache的开源版本。开源版本相对于阿里云上的商业版本,功能上略有缺失,但是大体上功能是一样的。

1.1、RocketMQ的发展历程

​ 早期阿里使用ActiveMQ,但是,当消息开始逐渐增多后,ActiveMQ的IO性能很快达到了瓶颈。于是,阿里开始关注Kafka。但是Kafka是针对日志收集场景设计的,他的并发性能并不是很理想。尤其当他的Topic过多时,由于Partition文件也会过多,会严重影响IO性能。于是阿里才决定自研中间件,最早叫做MetaQ,后来改名成为RocketMQ。最早他所希望解决的最大问题就是多Topic下的IO性能压力。但是产品在阿里内部的不断改进,RocketMQ开始体现出一些不一样的优势。

1.2、RocketMQ产品特点比较

​ RocketMQ的消息吞吐量虽然依然不如Kafka,但是却比RabbitMQ高很多。在阿里内部,RocketMQ集群每天处理的请求数超过5万亿次,支持的核心应用超过3000个。

​ RocketMQ天生就为金融互联网而生,因此他的消息可靠性相比Kafka也有了很大的提升,而消息吞吐量相比RabbitMQ也有很大的提升。另外,RocketMQ的高级功能也越来越全面,广播消费、延迟队列、死信队列等等高级功能一应俱全,甚至某些业务功能比如事务消息,已经呈现出领先潮流的趋势。

​ RocketMQ的源码是用Java开发的,这也使得很多互联网公司可以根据自己的业务需求做深度定制。而RocketMQ经过阿里双十一多次考验,源码的稳定性是值得信赖的,这使得功能定制有一个非常高的起点。

​ 传统意义上,RocketMQ有一个比较大的局限,就是他的客户端只支持Java语言。但RocketMQ作为一个开源软件,自身产品不断成熟的同时,周边的技术生态也需要不断演进。RocketMQ成为Apache顶级项目后,又继续通过社区开发出了很多与主流技术生态融合的周边产品。例如在RocketMQ的社区,也正在开发GO,Python,Nodejs等语言的客户端。下图列出了RocketMQ社区目前的一些项目

image.png

二、RocketMQ快速实战

​ RocketMQ的官网地址: rocketmq.apache.org ,github地址是 github.com/apache/rock… ,当前最新的版本是5.1.0。我们这次采用4.9.1版本来进行演示

2.1、下载RocketMQ

​ 最新版本的RocketMQ可以到官网上进行下载。历史版本需要到Github仓库中下载。下载地址:github.com/apache/rock…

也可以在官网进行下载

2.2、快速安装RocketMQ

​ RocketMQ的安装非常简单,就是上传解压就可以了。

​ 安装RocketMQ之前需要先安装JDK,JDK自行安装好则进行下一步

将下载的rocketmq-all-4.9.1-bin-release.zip上传到/usr/local/soft/目录并完成解压。完成后,把rocketmq的bin目录也配置到环境变量当中。 vim /etc/profile,加入以下内容,并执行source vim /etc/profile让环境变量生效:

#rocketmq环境变量 
export ROCKETMQ_HOME=/usr/local/soft/rocketmq 
PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin

这样RocketMQ就安装完成了。我们把他运行起来。

这个ROCKETMQ_HOME的环境变量是必须要单独配置的,如果不配置的话,启动NameSever和Broker都会报错。

这个环境变量的作用是用来加载$ROCKETMQ_HOME/conf下的除broker.conf以外的几个配置文件。所以实际情况中,可以不按这个配置,但是一定要能找到配置文件。

2.3、 快速运行RocketMQ

2.3.1 RocketMQ工作原理

​ 运行之前,我们需要对RocketMQ的组件结构有个大致的了解。

image.png

RocketMQ由以下这几个组件组成

  • NameServer : 提供轻量级的Broker路由服务(作为服务注册,多个服务之间是相互隔离的,没有任何数据交互)。
  • Broker:实际处理消息存储、转发等服务的核心组件(会将服务注册到NameServer中,分为Master和Slave节点,Master作为数据的读写,Slave作为数据备份)。
  • Producer:消息生产者集群。通常是业务系统中的一个功能模块。
  • Consumer:消息消费者集群。通常也是业务系统中的一个功能模块。

所以我们要启动RocketMQ服务,需要先启动NameServer,然后再启动Broker。

大概的工作原理是:

首先将NameServer服务启动起来作为服务注册,然后再将Broker服务启动,Broker服务会注册到NameServer中,这样Producer启动的时候会和NameServer进行连接,获得在NameServer注册的Broker,然后Producer再将消息发送到Broker中。

2.3.2 NameServer服务搭建

​ 启动NameServer非常简单, 在$ROCKETMQ_HOME/bin目录下有个mqadminsrv。直接执行这个脚本就可以启动RocketMQ的NameServer服务。

​ 但是要注意,RocketMQ默认预设的JVM内存是4G,这是RocketMQ给我们的最佳配置。但是通常我们用虚拟机的话都是不够4G内存的,所以需要调整下JVM内存大小。修改的方式是直接修改runserver.sh。 用vi runserver.sh编辑这个脚本,在脚本中找到这一行调整内存大小为512m

image.png

然后我们用静默启动的方式启动NameServer服务:

nohup mqnamesrv &

启动完成后,在nohup.out里看到这一条关键日志就是启动成功了。并且使用jps指令可以看到有一个NamesrvStartup进程

Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release 
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release. 
The Name Server boot success. serializeType=JSON

image.png

2.3.3 Broker服务搭建

​ 启动Broker的脚本是runbroker.sh。Broker的默认预设内存是8G,启动前,如果内存不够,同样需要调整下JVM内存。vi runbroker.sh,找到这一行,进行内存调整,我这边设置512m

image.png

然后我们需要找到$ROCKETMQ_HOME/conf/broker.conf, vi指令进行编辑,在最下面加入一个配置(设置自动创建Topic):

autoCreateTopicEnable=true

​ 然后也以静默启动的方式启动runbroker.sh

nohup mqbroker &

启动完成后,同样是检查nohup.out日志,有这一条关键日志就标识启动成功了。 并且jps指令可以看到一个BrokerStartup进程。

The broker[Jony1, 192.168.253.131:10911] boot success. serializeType=JSON

在观察runserver.sh和runbroker.sh时,我们还可以查看到其他的JVM执行参数,这些参数都可以进行定制。例如我们观察到一个比较有意思的地方,nameServer使用的是CMS垃圾回收器,而Broker使用的是G1垃圾回收器。

2.3.4 命令行启动客户端实现消息的收发

在RocketMQ的安装包中,提供了一个tools.sh工具可以用来在命令行快速验证RocketMQ服务,通过调用tools.sh 就可以实现测试消息收发

首先需要配置一个环境变量NAMESRV_ADDR指向我们启动的NameServer服务。

image.png

启动消息生产者发送消息,默认会发1000条消息

bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

image.png

这日志中,上面部分就是我们发送的消息的内容。后面两句标识消息生产者正常关闭。

然后启动消息消费者接收消息:

bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

启动后,可以看到消费到的消息。

image.png

日志中MessageExt后的整个内容就是一条完整的RocketMQ消息。我们要对这个消息的结构有个大概的了解,后面会对这个消息进行深入的理解。其中比较关键的属性有:brokerName,queueId,msgId,topic,cluster,tags,body,transactionId。先找下这些属性在哪里。

而这个Consume指令并不会结束,他会继续挂起,等待消费其他的消息。我们可以使用CTRL+C停止该进程。

2.3.5 关闭RocketMQ服务

要关闭RocketMQ服务可以通过mqshutdown脚本直接关闭

# 1.关闭NameServer

sh bin/mqshutdown namesrv

# 2.关闭Broker

sh bin/mqshutdown broker