MQ延迟消息

10 8月

在各类业务中有一种很常见的要求就是在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/

发表评论

电子邮件地址不会被公开。