bboyjing's blog

RocketMQ学习笔记一【Hello MQ】

最近项目需要使用RocketMQ,之前没有使用过,现在花点时间来学习下,顺便记录下学习过程。目前没有去找其他资源,先参照下官网文档学学看。

Quick Start

基本上都是这套路,先照着Quick Start画个瓢。这里,Quick Start的目的是让使用者在本机快速地搭建RocketMQ系统,并且能够收发消息。对于系统以及软件的要求,官网说的很明确,下面列一下我本机的环境:

1
2
3
4
OS name: "linux", version: "4.4.0-24-generic", arch: "amd64", family: "unix"
Java version: 1.8.0_91, vendor: Oracle Corporation
Apache Maven 3.3.9
git version 2.7.4

参照下来,满足要求了。下面一步是把RocketMQ下载下来,Quick Start中使用的方式是直接clone代码,然后自己build。直接clone的代码是最新的,我们保守点,还是下载最新的release版本,目前最新版是rocketmq-4.0.0-incubating。下载下来之后执行如下步骤,当然下载目录和安装目录按自己喜好来。

1
2
3
4
> cd ~/Downloads
# 目录名太长了,改改
> mkdir rocketmq && tar -zxvf incubator-rocketmq-rocketmq-4.0.0-incubating.tar.gz -C ./rocketmq --strip-components 1
> mvn clean package install -Prelease-all assembly:assembly -U

上面最后一步有可能会出编译失败,我这边遇到的问题是,可能因为之前的不当修改导致hostname对应ip不是当前的有效ip,最终导致common项目下的MixAllTest.testGetLocalInetAddress()方法测试不通过。当然,遇到的问题可能会不一样,但是仔细看编译错误,会给出提示信息,比如:

1
2
Please refer to /home/zhangjing/Downloads/rocketmq/common/target/surefire-reports
for the individual test results.

我们照着提示信息去看下,发现surefire-reports是个文件夹,里面有一系列txt文件,存放着编译结果。如果不知道具体是哪儿出问题的话,可能需要逐个看下,也没几个文件。而且打印出来的错误也比较详细,相信很容易就能问题。我这边把hostname对应的ip改成127.0.0.1之后,就能顺利编译完成了。
最后把编译完的程序包拷贝到安装目录:

1
2
3
sudo cp -r target/apache-rocketmq-all /opt
# 本机测试
sudo chmod -R 777 apache-rocketmq-all

启动 Name Server

到这一步时RocketMQ已经成功编译好了,执行下面的步骤,可以启动Name Server。至于这个Name Server的作用是什么,后面再看。

1
2
3
4
5
6
> cd /opt/apache-rocketmq-all
> nohup sh bin/mqnamesrv &
> tail -f ~/logs/rocketmqlogs/namesrv.log
...
INFO main - The Name Server boot success. serializeType=JSON
...

可以看出,RocketMQ默认的log位置在当前用户目录的logs/rocketmqlogs/中,从截取的输出可以看出,Name Server启动成功了。顺便看下~/logs/rocketmqlogs/目录,当前只有两个文件namesrv.log和namesrv_default.log,如果日后Name Server出问题,知道去哪儿看日志。

启动 Broker

下面命令可以启动Broker:

1
> nohup sh bin/mqbroker -n localhost:9876 &

命令执行完之后,笔记本直接卡死了,过了好几分钟有点缓过来。最终看到占用资源的进程:/usr/lib/jvm/jdk1.8.0_91/bin/java -server -Xms8g -Xmx8g…,原来是RocketMQ一个Broker的启动直接申请了8g内存,我电脑内存也才8g。修改下启动脚本bin/runbroker.sh:

1
2
3
> vim bin/runbroker.sh
# 将JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn1g"修改成如下:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"

修改完之后,启动就正常了,下面看下log:

1
2
3
> tail -f ~/logs/rocketmqlogs/broker.log
...
The broker[asus, 172.17.0.1:10911] boot success. serializeType=JSON and name server is localhost:9876

虽然看log是启动成功了,但是注意下ip,172.17.0.1是安装的docker的ip。官网也有提示说,broker ip不能使用loopback network,也就是不能是127.0.0.1,所以启动的时候自动选择了一个不是回环地址的ip。查了一下,通过broker的brokerip1属性可以手动修改,但是这里暂时不需要修改,知道下有这回事情就可以了。

收发消息

在收发消息之前,我们需要告诉客户端name servers的地址,RocketMQ提供多种配置方式。简单的方式是通过环境变量,在合适的位置添加NAMESRV_ADDR:

1
export NAMESRV_ADDR=localhost:9876

消息生产者测试:

1
2
3
4
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
...
SendResult [sendStatus=SEND_OK, msgId=AC11000122791B6D35861B139B380000...]
...

消息消费者测试:

1
2
3
4
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
...
ConsumeMessageThread_2 Receive New Messages: ...
...

停止服务

停止Broker:

1
2
3
> sh bin/mqshutdown broker
The mqbroker(8411) is running...
Send shutdown request to mqbroker(8411) OK

停止Name Servers:

1
2
3
> sh bin/mqshutdown namesrv
The mqnamesrv(4716) is running...
Send shutdown request to mqnamesrv(4716) OK