mq的应用及普及,已经深入到了每一个互联网公司。至少掌握一门mq相关的中间件技术,是每一个合格的程序员的标配。
RocketMQ是阿里开源的一个消息中间件,之前也有所了解和使用,但是从来没在自己的云服务器上真正部署和实践。(因为公司已经有封装好的mq客户端)。故,这次从头部署、实践,一步步深入理解这个由阿里中间件团队贡献给Apache的消息中间件。
环境
- 阿里云服务器(ECS),2G内存,1核。配置较低,入门级。
- 安全组
开启端口9876和10911:
安装
- 下载
wget http://mirrors.hust.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-source-release.zip
- 安装
unzip rocketmq-all-4.2.0-source-release.zip mv rocketmq-all-4.2.0 /usr/local/rocketmq cd /usr/local/rocketmq mvn -Prelease-all -DskipTests clean install -U cd distribution/target/apache-rocketmq
参考官网:http://rocketmq.apache.org/docs/quick-start/
注意:在安装过程中,一定要注意官网上指明的其他软件的版本,比如:JDK一定要1.8以上,maven一定要3.2以上,我就在maven版本上挖了坑。。。
启动
- 启动nameserver
nohup sh bin/mqnamesrv & tail -f ~/logs/rocketmqlogs/namesrv.log The Name Server boot success...
- 启动broker
nohup sh bin/mqbroker -n localhost:9876 & tail -f ~/logs/rocketmqlogs/broker.log The broker[aliyun.jack, 172.16.74.201:10911] boot success. serializeType=JSON and name server is localhost:9876
问题汇总
- 内网ip
(1)描述
172.16.74.201是阿里云的内网ip,这样启动的话,外网是访问不到的,我电脑去访问的话,会报如下错误:
Exception in thread "main"
org.apache.rocketmq.remoting.exception.RemotingConnectException:
connect to <172.16.74.201:10911> failed
(2)解决
修改conf下的配置文件broker.conf,并修改启动命令vim conf/broker.conf
马赛克掉的ip就是阿里云的外网IP。
修改后执行启动命令:nohup sh bin/mqbroker -c conf/broker.conf &
- producer启动后,报异常
(1)描述
Exception in thread "main" org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <47.*.*.134:10909> failed
(2)解决
关闭vip通道:producer.setVipChannelEnabled(false);
- consumer启动后不消费
(1)描述
等了很久都没动静
(2)解决
关闭vip通道:producer.setVipChannelEnabled(false);
- No route info of this topic
(1)描述
创建不了topic
(2)解决
检查一下配置:autoCreateTopicEnable=true
可以通过命令查看,如下:sh bin/mqbroker -m >broker.p vim broker.p
扫描二维码关注公众号,回复: 1428671 查看本文章
演示效果
参考官网的例子:http://rocketmq.apache.org/docs/order-example/
- producer
- consumer
有重复消费的现象(生产10条,消费13条),这是因为官方示例中,有的消息返回状态码:
ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT。
修改所有消息返回成功状态:ConsumeOrderlyStatus.SUCCESS
这个时候,就不会出现重复消息的情况。如下图:
生产10条,消费10条。
本文由 小王穷遊 创作。 可自由转载、引用,但需署名作者且注明文章出处。