最近公司要做一个定时器功能,需求如下
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内存不足导致的,
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=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
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即可
注意:当docker服务启动后与docker相关的网络会自动开。
4:关闭docker发现还是出现问题
查看hosts发现服务器配置了多个域名,导致rocket无法监听具体端口
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
解决方案:修改${ROCKET_MQ}/conf/broker.conf
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