目前的顺序是这样的:生产者 -> redis队列 -> rocketmq -> 消费者。
分析:这样不仅增大了消息的传输成本,也增大了系统的复杂性(需要增加很多额外的操作来保证redis队列删除元素和发送消息到rocketmq这两步操作都成功)。
既然开源版的rocketmq提供的延迟消息时间不能满足系统的需求,完全可以采用其他方式来实现。
建议优化成:
生产者 -> redis队列 -> 消费者
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
rocketmq的延时任务貌似只有级别,没有固定18秒执行,16分30秒执行这种配置吧。。。
1、部分历史遗留问题,最初代码结构延时任务消费是在每个项目中的,而不是在consumer项目中,基于业务独立,consumer的代码不可能被其他业务调用所以需要发送mq到消费者执行。
2、基于现有的结构,期望的是把延时任务的调度和延时任务的执行。
考虑到分布式部署,多节点运行时:延时任务执行时间不可控,在代码中是新建线程去执行任务的,如果某一节点的线程消费大量延时任务,那么可能出现一个节点已经OOM,其他服务器没消息可以消费。交付mq去控制节点轮询,消息顺序消费,不会有内存资源问题,比通过我们现有的线程直接调用更合理一些。在这种情况下,消费延时任务的线程只是负责给mq发送一条消息,就会快速释放掉线程资源,而具体的业务的消费也不会耽搁。
类似的架构还有定时任务,xxljob也是发送一个mq而不是直接执行,也是同样的道理,如果将来替换xxljob为其他调度机制,不会改变除了任务调度之外的任何代码。
目前这个暂时不考虑优化成描绘的样子,您的想法很棒,可以照那个样子去优化。
登录 后才可以发表评论