1. 安装
安装RocketMQ
参考RocketMQ官方文档的Quick Start即可,比较简单。可以选择从GitHub上下载后自己编译安装,也可以选择直接编译好的二进制文件来安装。
虽然官方推荐使用Linux/Unix/Mac
,但是其实还是可以在Windows
下安装的,通过解压出来的bin
目录下的各种.cmd
后缀的文件即可看出。所以,如果当下只有Windows
电脑,也可以来搭建一个用于学习。
安装RocketMQ Console(可选)
我们先了解一下这个Console。它主要是针对RocketMQ所做的一个界面管理工具,方便后期的运维管理,查看当前的MQ使用情况,包括Producer、Consumer、Broker、Topic甚至Msg的管理。当然了,如果你比较喜欢命令行的形式也可以使用bin目录下的mqadmin
来去管理。
OK,回到安装话题。首先,访问apache的RocketMQ扩展项目GitHub,下载后直接通过maven编译构建rocketmq-console
模块即可得到rocketmq-console-ng-1.0.1.jar
。由于该项目是用的Spring Boot,所以直接以jar包的方式运行即可。
如果需要修改端口配置,可以在项目中的src\main\resources
目录下的application.properties
文件中修改server.port
参数。
PS.需要特别注意一下rocketmq.config.isVIPChannel
参数,后面会讲到。
PPS.当前使用的RocketMQ版本是4.4.0,RocketMQ-Console版本是1.0.1
2. 运行RocketMQ
运行之前我们先了解几个概念。RocketMQ中有这样几个角色:
- Producer 消息生产者
- Consumer 消息订阅者或者消息的消费者
- NameServer 最上层的管理服务,路由、查找功能
- Broker 实际消息的中间接收人,存储消息
Linux环境
首先我们要先启动最上层的服务——NameServer
进入bin目录,执行:nohup sh ./mqnamesrv &
,并通过tail -f ~/logs/rocketmqlogs/namesrv.log
查看日志,这个路径是默认的日志存储路径。确认NameServer是否启动成功。
然后,我们再启动Broker,同理,在bin目录下执行:nohup sh bin/mqbroker -n localhost:9876 &
,并通过tail -f ~/logs/rocketmqlogs/broker.log
确认Broker是否启动成功。
Windows环境
Windows下指令没有太大变化,分别在bin目录下依次执行start mqnamesrv.cmd
和start mqbroker.cmd -n 127.0.0.1:9876
来启动NameServer和Broker,这里指令执行时会重新打开两个行的cmd窗口来执行命令,记得不要关闭,不然服务就终止了。
3. 运行Demo
直接使用官方示例或者自己根据官方的QuickStart写一些demo都可以运行,这里不再赘述。
3. 一些碰到的坑
(1). 自己本地通过maven编译RocketMQ-Console时,可以加上-DMaven.test.skip=true
命令来跳过自动测试,一方面是缩短打包时间,另一方面,运行测试可能会报错,导致无法打包成功。
(2). 本地运行demo,使用同步方式来发送消息一切正常,改为使用异步方式时就会报错。可以检查一下Producer类中是否在最末加上了producer.shutdown()
代码,可以尝试注释后再运行试试,或者在这行代码前加个线程休眠。这种情况的原因是Producer还未能收到异步响应结果时,代码就已经执行到shutdown
这里,直接关闭了。
(3). demo访问本地安装的RocketMQ运行正常,访问云服务器上安装的服务时,发现Producer发送消息访问超时。首先检查端口策略是否开通:NameServer服务默认端口9876
、Broker服务默认端口10911
。如果还不行,检查一下Broker注册到NameServer里面的IP是不是局域网IP,如果是请改成外网IP再重启重新注册。原因是Producer在发送消息时只是向NameServer去查询对应的Broker,拿到对应的IP和端口进行使用,并不是由NameServer来发送消息,所以Broker服务的IP必须以外网形式暴露出去。
(4). 云服务上安装了RocketMQ-Console,结果打开后发现,查不到当前已经运行的Broker,并且刷新页面会提示无法访问10909
端口。请检查console中的application.properties
中的rocketmq.config.isVIPChannel
参数,如果为true,请开通该端口的访问策略,因为10909
端口是RocketMQ的消息VIP端口,如果配置为true,console会使用到该端口;另外如果没有用到VIP,可以不开通策略,并在demo中的Producer和Consumer代码中显示的设置VIP为false(默认配置为true),这样也能解决这个问题。
网友评论