版本选型
https://zhuanlan.zhihu.com/p/573949726
官方demo
https://rocketmq.apache.org/zh/docs/quickStart/01quickstart/
官方部署方案选型
https://rocketmq.apache.org/zh/docs/deploymentOperations/01deploy
rocketmq-client官方支持
https://github.com/apache/rocketmq-clients/tree/rocketmq-client-java-5.0.0/java
官方只提供5.0以上的原生客户端支持,而且JDK需要11+,不适用公司框架
![](https://i-blog.csdnimg.cn/blog_migrate/5f6abfb7979ef1ae941c72c453599bea.png)
我司采用4.4.0版本,选用rocketmq-spring-boot-starter客户端sdk包
<!-- MQ 消息中间件 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.2</version>
<exclusions>
<exclusion>
<artifactId>fastjson</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>
本地环境部署:
ip:192.168.1.214
踩坑笔记:
进入官网下载的二进制包解压目录:
cd /usr/local/ksb/rocketmq-all-4.4.0-bin-release/
启动namesrv路由服务: (类似于nacos服务发现和注册中心)
sudo nohup sh bin/mqnamesrv -n 192.168.1.214:9876 &
sudo tail -f /root/logs/rocketmqlogs/namesrv.log
查看端口是否正常开放:
netstat -ntlp | grep 9876
坑1:服务启动命令没有效果, 在当前目录nohub.out日志里,发现提示日志目录不存在
需要root权限执行, 统一加上sudo
坑2:服务启动命令依旧没有效果, 查看nohup.out日志文件, 提示JAVA_HOME没配置:
mjs@test-reguler:/usr/local/ksb/rocketmq-all-4.4.0-bin-release$ which java
/usr/lib/jvm/java-8-openjdk-amd64/bin/java
环境变量配置
sudo vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export NAMESRV_ADDR=127.0.0.1:9876
source /etc/profile
echo $JAVA_HOME
echo $NAMESRV_ADDR
再次依然没有用......
官方文档并没有交代这个问题, 查看mqnamesrv启动文件源码, 发现这行[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java[疑问]
不理解官方为何又把JAVA_HOME默认配置为/usr/java路径
于是手动修改bin/目录下runserver.sh和runbroker.sh文件里的JAVA_HOME变量配置:
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
修改启动配置内存
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
$JAVA ${JAVA_OPT} $@
启动broker服务: (同时承担计算和存储的功能, 5.0之后拆分为代理proxy和broker存储组件, 更利于云原生环境下的资源解耦)
sudo nohup sh bin/mqbroker -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true &
sudo tail -f /root/logs/rocketmqlogs/broker.log
查看端口是否正常开放:
netstat -ntlp | grep 10909
netstat -ntlp | grep 10911
启动管理后台:
sudo docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.214:9876" -p 8782:8080 -t apacherocketmq/rocketmq-dashboard:latest
再次启动:
sudo docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.214:9876" -p 8782:8080
查看进程:
ps -aux | grep rocket
mjs@test-reguler:~$ ps -aux | grep rocket
root 425 0.0 0.0 4636 812 ? S Feb17 0:00 sh /usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup -n 192.168.1.214:9876
root 438 0.1 0.6 3795328 211288 ? Sl Feb17 1:49 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:-UseLargePages -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../lib -cp .:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../conf: org.apache.rocketmq.namesrv.NamesrvStartup -n 192.168.1.214:9876
root 3147 0.0 0.0 4636 824 ? S Feb17 0:00 sh /usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true
root 3184 2.5 1.3 5766664 438064 ? Sl Feb17 35:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -server -Xms256m -Xmx256m -Xmn128m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=15g -XX:-UseLargePages -XX:-UseBiasedLocking -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../lib -cp .:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../conf: org.apache.rocketmq.broker.BrokerStartup -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true
root 8940 0.0 0.0 4336 736 ? Ss+ Feb17 0:00 sh -c java $JAVA_OPTS -jar /rocketmq-dashboard.jar
root 9718 0.3 0.8 12057696 264940 ? Sl+ Feb17 5:18 java -Drocketmq.namesrv.addr=192.168.1.214:9876 -jar /rocketmq-dashboard.jar
mjs 9802 0.0 0.0 13140 1048 pts/2 S+ 16:22 0:00 grep --color=auto rocket
官方测试用例:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
关闭服务:
sudo sh bin/mqshutdown broker
sudo sh bin/mqshutdown namesrv
在java客户端服务上调试
坑3:在服务器上可以收发消息,但外部java客户端连接提示超时:
org.springframework.messaging.MessagingException: sendDefaultImpl call timeout;
修改超时时间配置为6s后解决,首次发送同时要创建主题较慢:
# 消息发送超时时长,默认3s
rocketmq.producer.send-message-timeout=6000
题外话: 在亲手搭建完后, 再回过头比较一下ChatGPT给出的答案是怎么样的?
第一次较模糊的提问:
![](https://i-blog.csdnimg.cn/blog_migrate/df71dd86cabc9414c2df13d5345b5874.png)
以下是ChatGPT答复内容:
1、下载和解压RocketMQ
首先,下载RocketMQ最新发布的压缩包。可以在官网查看最新发布链接:http://rocketmq.apache.org/release_notes/release-notes-4-7-1/。解压之后会得到一个名为rocketmq-all-4.7.1-bin-release.zip的文件,这里下载的是4.7.1版本。解压到你想要的文件夹中。
2、准备环境和Java
RocketMQ需要先准备环境,包括Java和Linux环境,先安装JDK 8或者更新版本的Java,建议Java 8。
3、配置环境变量
在Linux下,需要修改/etc/profile文件,将RocketMQ的安装路径,以及JAVA_HOME的路径定义到文件中:
export ROCKETMQ_HOME=/opt/rocketmq
export PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH
4、启动NameServer
NameServer即服务器节点,需要修改RocketMQ源码中conf目录下的2个配置文件: broker.conf和namesrv.conf。
- 先修改broker.conf,注释掉broker启动配置部分
- 然后修改,namesrv.conf,修改NameServer启动端口,默认9876
修改完之后,在安装文件夹中运行如下命令:
sh mqnamesrv
即可启动NameServer。
5、启动broker
在RocketMQ安装目录中,修改conf/2个配置文件,broker.conf和namesrv.conf,在和上面步骤相反的顺序下进行操作,先解开broker的配置注释,注意修改几个参数:
broker.name=default_broker // 修改broker名称
broker.id=0 // 修改broker ID
然后再配置namesrv.conf,添加NameServer端口,默认为9876:
#在这里配置NameServer地址
namesrv.addr=127.0.0.1:9876
修改完毕后,在安装路径中运行如下命令:
sh mqbroker -n 127.0.0.1:9876
即可启动broker。
6、启动监控中心
RocketMQ提供了方便的监控中心,可以用来监控broker和nameServer的状态,监控中心可在conf文件中进行配置,具体的配置可查看官方文档,通常配置如下:
# Web 监控中心配置
# web.resources 是web资源文件路径,将静态资源解压到该路径
web.resources=/opt/rocketmq/web
# web.port配置监控中心的端口号
web.port=8080
# web.context 配置web启动的根路径
web.context=/
web.resources目录中有个文件,rocketmq-plugins.tgz,解压到web.resources的目录,修改完配置后,运行如下命令:
sh mqweb
即可启动监控中心web页面,即可使用浏览器打开:http://localhost:8080 来访问监控中心,进行相关操作。
7、停止和启动
在RocketMQ安装路径下运行如下命令,进行停止或启动:
停止运行:
sh mqshutdown
开始运行:
sh mqstart
以上就是RocketMQ安装和启动的全部过程,一般来说安装和启动还是比较简单的,写文件和修改配置对环境有要求,这点需要注意一下。
第二次较精准的提问?
![](https://i-blog.csdnimg.cn/blog_migrate/d280bfed198c35bf9a9f658bf275d761.png)
1. 访问Apache RocketMQ 主页,https://rocketmq.apache.org/,选择“download”,下载 RocketMQ v4.4.0 的部署文件。
2. 将 apache-rocketmq-4.4.0-bin-release.zip 文件解压到你的机器上,假设解压目录为/opt/rocketmq。
3. 创建软件目录,在 /usr/local 下面创建一个 rocketmq 的文件夹,并将刚才解压的文件 rocketmq-4.4.0 复制到这个文件夹;
4. 导入RocketMQ环境变量,让系统能够知道RocketMQ的安装目录,编辑 profile 文件:
vi /etc/profile
增加以下语句:
export ROCKETMQ_HOME=/usr/local/rocketmq
export PATH = $PATH:$ROCKETMQ_HOME/bin
保存profile 文件后,使配置文件生效:
source /etc/profile
5. 修改 bin 目录下的 runbroker.sh 文件,将 JAVA_HOME 设置为 JDK的安装目录:
vi $ROCKETMQ_HOME/bin/runbroker.sh
修改其中的 JAVA_HOME 配置,例如:
-export JAVA_HOME=/usr/local/jdk8
6. 配置 NameServer 地址,打开 conf 目录下的 2个配置文件broker.conf和namesrv.conf,分别将里面的 IP 设置为服务器的当前 IP 地址 。
7. 启动 NameServer,cd 到 RocketMQ 目录下的 bin 目录,然后运行:
sh mqnamesrv &
8. 启动 Broker,cd 到 RocketMQ 目录下的 bin 目录,然后运行:
sh mqbroker -n localhost:9876 &
9. 查看启动结果,可以使用 jps 命令查看当前进程中有没有名为“NameServer”和“Broker”的进程,即可知道 RocketMQ 已经启动成功了
### 前台启动
1.停止RocketMQ服务,在bin目录下执行命令
```
./mqshutdown broker
```
2.启动RocketMQ服务,在bin目录下执行命令
```
./mqbroker -n localhost:9876
```
![](img/1.jpg)
### 后台启动
1.停止RocketMQ服务,在bin目录下执行命令
```
./mqshutdown broker
```
2. 后台启动,可以使用 nohup 命令运行 Broker:
```
nohup sh mqbroker -n localhost:9876 &
```
如果需要查看启动日志可以用 tail 命令:
```
tail -f ~/logs/rocketmqlogs/broker.log
```
##
#### 四:常见问题
1.mqshutdown 移除broker失败,提示绑定的实例数为0
解决方案:
打开namesrv的配置文件 `$ROCKETMQ_HOME/conf/namesrv.conf`,查看日志
```
#是否开启DeleteTopic流程删除topic,建议关闭,避免误操作
enablePropertyFilter=false
```
把上面的值改为`enablePropertyFilter=true`
然后重启mqnameerver
2.停止Broker失败,报错信息`Failed to invoke the command, please check if the Native Process Plugin is enabled`
解决方案:
编辑broker的配置文件 `/conf/broker.conf`,查看日志
```
#最大允许的broker拉取的未被消费的消息的总字节数 getMaxAccumulation。当设置为-1,则不拉取
#maxAccumulationMsgByteSize=-1
```
把上面的值改为`maxAccumulationMsgByteSize=1638400`
然后重启mqbangker即可。
3. Broker 日志中报 `No route info of this topic`的错误。
解决方案:使用 DefaultMQAdmin 这个工具,设置 Topic 名字的可见性:
```
sh mqadmin updateTopic
```
4. Broker 启动失败,报错信息`Start mqbroker failed`
解决方案:
1. 打开 `conf` 目录下的 2个配置文件broker.conf和namesrv.conf,查看`brokerIP1`和`brokerIP2`配置项是否正确。
2. 确认相应的端口号是否已经打开, 可以使用 `netstat -an` 命令查看。
可以看出确实能提升自己去网上查资料的效率,有些操作的坑也已经直接给出了答案(但没有交代为什么这么做的背景), 虽然太细节的基础问题还是得开发自己去排查.
可以提升查询文档的效率,过滤掉网上的信息噪音是值得肯定的.