本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2019/08/10/mq-delay-message/
在各类业务中有一种很常见的要求就是在XX小时之后,执行XX。
简单常用一点的就是用户点了外卖取餐以后24小时内可以给骑手/商家评价,超时不可评价且修改评价为X星。
简单粗暴的办法肯定是来一个定时任务,扫描为评价的且超过评价时间的数据,并修改相关值。
这个方法很直接,主要的缺陷如下:
- 实效性低
- 效率低
实效性主要是定时任务执行间隔,这个主要看任务每次运行的间隔是多少。效率问题主要是扫表引起的,特别是数据量较大的时候,加上查询条件复杂,那速度和效率肯定是上不来的。
比较方便的方案是把延迟这个事情本身让外部控制,比如MQ,发送一个延迟MQ消息,在XX小时过后消费即可。
开源RocketMQ
RocketMQ的开源版本提供了延迟消息,但是它的延迟消息并不是任意精度的,而是所谓的延迟时间级别,具体时间是可以配置的,默认配置是
public class MessageStoreConfig { private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"; }
具体实现可以参考文末的链接。如果这种模式是可以满足业务的,其实也是可以的。
阿里云RocketMQ
如果实在需要精确的延迟控制,目前没有合适的开源版本可用。阿里云的收费RocketMQ是支持秒级别的任意时间延迟。
腾讯云提供收费MQ从文档看也是同样支持的。
参考
https://www.kunzhao.org/blog/2018/04/12/rocketmq-timing-message-and-retry-message/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2019/08/10/mq-delay-message/