RocketMQ整体的架构设计主要分为四大部分,分别是:Producer、Consumer、Broker、NameServer。
用一段话来概括它们之间的交互:先启动 NameServer 集群,各 NameServer 之间无任何数据交互,Broker 启动之后会向所有 NameServer 定期(每 30s)发送心跳包,包括:IP、Port、TopicInfo,NameServer 会定期扫描 Broker 存活列表,如果超过 120s 没有心跳则移除此 Broker 相关信息,代表下线。
这样每个 NameServer 就知道集群所有 Broker 的相关信息,此时 Producer 上线从 NameServer 就可以得知它要发送的某 Topic 消息在哪个 Broker 上,和对应的 Broker (Master 角色的)建立长连接,发送消息。
Consumer 上线也可以从 NameServer 得知它所要接收的 Topic 是哪个 Broker ,和对应的 Master、Slave 建立连接,接收消息。
注意:安装rocketmq需要提前安装好jdk和maven
获取rocketmq
wget https://archive.apache.org/dist/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip
解压
unzip rocketmq-all-4.8.0-bin-release.zip
如果没有unzip命令,可以用yum 安装 unzip yum install -y unzip zip
修改bin/runbroker.sh
和 runserver.sh
中堆内存大小
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m"
nohup sh mqnamesrv &
查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log
# 1.启动Broker
nohup sh mqbroker -n localhost:9876 &
# 2.查看启动日志
tail -f ~/logs/rocketmqlogs/broker.log
打开两个shell终端,一个发送消息,一个接收消息,在切换到bin目录下export NAMESRV_ADDR=localhost:9876
发送消息
export NAMESRV_ADDR=localhost:9876
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
接收消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
无论是关闭name server还是broker,都是使用bin/mqshutdown命令
sh mqshutdown broker
sh mqshutdown namesrv
Dashboard是一个Java web 项目,Maven工程。通过源码编译成jar包后启动即可通过浏览器访问。通过html界面可以查看RockeMQ集群状态、创建/删除Topic、生产/消费等。
wget https://github.com/apache/rocketmq-dashboard/archive/refs/tags/rocketmq-dashboard-1.0.0.tar.gz
解压之后编译
mvn clean package -Dmaven.test.skip=true -f rocketmq-dashboard-rocketmq-dashboard-1.0.0
前台启动:java -jar rocketmq-dashboard-1.0.0.jar
后台启动 nohup java -jar rocketmq-dashboard-1.0.0.jar &
查看进程: ps -ef | grep rocketmq-dashboard-1.0.0.jar
杀死进程:kill -9 pid
安装完成后通过 8080 端口访问,如 http://localhost:8080/
由于我的centos只有4G内存,为了避免内存不足,我打算本地电脑启动
同样下载源码,在idea中运行springboot项目,修改配置文件。
如果不填namesrvAddr,默认为localhost:9876
由于我的rocketmq在腾讯云中,本地运行后会抛出异常
java.lang.RuntimeException: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to 172.17.0.1:10909 failed
at com.google.common.base.Throwables.propagate(Throwables.java:241)
at org.apache.rocketmq.dashboard.task.DashboardCollectTask.collectTopic(DashboardCollectTask.java:161)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
解决办法:
找到rocketmq中的conf文件,找到border.conf,然后添加brokerIP1=腾讯云外网ip
brokerIP1 = 公网ip
namesrvAddr = 127.0.0.1:9876
Rocket 使用 SQL 过滤, 还需要再broker.conf文件中添加配置enablePropertyFilter=true
切记:修改配置后要这样启动 (启动broker 加载指定配置文件)
nohup sh mqbroker -n 127.0.0.1:9876 -c ../conf/broker.conf &