rocketMQ安装过程以及所踩过的很多坑

最近公司要做一个定时器功能,需求如下

1:s-e时间范围内,执行n分钟后关闭m分钟,在执行n分钟在关闭m分...

2:定时执行

3:重复执行

开始想了8套解决方案,在此做一个记录

1:定时器每分钟扫描数据库表,缺点数据库压力过大等

2:考虑数据库压力过大,遂考虑缓存优化,redis缓存在线的设备的定时任务,数据库定期增量update到redis

3:

4:

5:

6:

7:spring动态定时器+延时队列

8:延时队列

物联网项目每分钟的并发量考虑会持续增长,参考各种队列遂选择rocketmq

但是直到今天才知道国内资料少的可怜。

所以在此分享部署rocket所遇到的坑

刚开始考虑采用docker部署 ,

1:启动mqbroker 时,报警信息都没有直接killer

多方查阅,是因为linux内存不足导致的,

修改docket内存配置
vi runbroker.sh/
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m"

JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=256m"

vi runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"

2:启动成功,java编写代码运行提示错误如下

org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, TopicTest

问题如上,修改内存后有时当内存没达到liunx警戒线会出现运行正常的情况,但是启动后显示没有路由,解决方案同上,根据个人电脑情况修改内存配置

3:运行java错误如下

org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [9501]ms, Topic: TopicTest, BrokersSent: [localhost.localdomain, localhost.localdomain, localhost.localdomain]
See http://rocketmq.apache.org/docs/faq/ for further details.
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:544)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1069)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1023)
at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:214)
at rocketmq.Producer.main(Producer.java:68)
Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.20.0.1:10909> failed
at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:388)
at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:351)
at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:335)
at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:298)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:696)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:463)

... 4 more

出现原因:ifconfig发现是因为服务器搭配多个主机或者docker导致的,

br-8a4bea00d3dc: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.20.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:fb:1c:e8:37  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

解决方案:禁用路由或docker即可

sudo ifconfig br-8a4bea00d3dc down

systemctl stop docker

注意:当docker服务启动后与docker相关的网络会自动开。

4:关闭docker发现还是出现问题

查看hosts发现服务器配置了多个域名,导致rocket无法监听具体端口

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

解决方案:修改${ROCKET_MQ}/conf/broker.conf

brokerIP1=192.168.3.3
namesrvAddr=192.168.3.3:9876
注意启动需要设置该配置文件,这里地址填具体的ip,而不是127.0.0.1或者localhost,
sh mqbroker -n localhost:9876 -c ${ROCKET_MQ}/conf/broker.conf

5:启动rocketmq-console错误
docker pull styletang/rocketmq-console-ng
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr= 127.0.0.1:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8080:8080 -t styletang/rocketmq-console-ng
问题原因:rocketmq直接启动的,而控制台是使用docker开启的,本质上与宿主机隔离
解决方案:127.0.0.1修改为rocketmq所在主机ip即可

docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.3.3:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8080:8080 -t styletang/rocketmq-console-ng

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值