延时消息

轻量消息队列(原 MNS)提供队列级别和消息级别的延时功能,本文为您介绍延时功能的典型应用场景、生效规则和使用方法。

应用场景

典型场景一:分布式定时调度

在分布式定时调度场景下,需要实现各类精度的定时任务,例如每天05:00执行文件清理,每隔2分钟触发一次消息推送等需求。传统基于数据库的定时调度方案在分布式场景下性能不高、实现复杂。基于轻量消息队列(原 MNS)的延时消息可以封装出多种类型的定时触发器。

典型场景二:任务超时处理

以电商交易场景为例,订单下单后暂未支付,此时不可以直接关闭订单,而是需要等待一段时间后才能关闭订单。使用轻量消息队列(原 MNS)延时消息可以实现超时任务的检查触发。

基于延时消息的超时任务处理具备如下优势:

  • 精度高、开发门槛低:基于消息通知方式不存在定时阶梯间隔。可以轻松实现任意精度事件触发,无需业务去重。

  • 高性能可扩展:传统的数据库扫描方式较为复杂,需要频繁调用接口扫描,容易产生性能瓶颈。轻量消息队列(原 MNS)的定延时消息具有高并发和水平扩展的能力。

功能说明

轻量消息队列(原 MNS)提供队列级别和消息级别的延时功能。

队列级别延时消息

创建队列时,设置消息延时时间(DelaySeconds)属性值,发送到本队列的所有消息默认将以本参数指定的时间被延后消费。

  • 单位:秒。

  • 取值:0~604800秒,即0秒至7天。

消息级别延时消息

创建消息时,设置消息延时时间(DelaySeconds)属性值,这条消息将以本参数指定的时间被延后消费。

  • 单位:秒。

  • 取值:0~604800秒,即0秒至7天。

设置生效规则

当消息的DelaySeconds值大于0时,消息级别的延迟设置优先于队列级别的延迟设置生效,这意味着,当一条消息具有特定的延迟属性时,该属性将覆盖队列配置中定义的延迟策略。

详细规则如下表所示:

场景

消息的DelaySeconds

队列的DelaySeconds

生效规则

场景一

大于0

大于等于0

消息级别的延迟设置优先于队列级别的延迟设置生效。

例如设置队列Queue-ADelaySeconds600秒:

  • 如果发送到队列Queue-A的消息Message1DelaySeconds设置为30秒,则延时的生效值是30秒,消息会在30秒后被消费者可见。

  • 如果发送到队列Queue-A的消息Message1DelaySeconds设置为1200秒,则延时的生效值是1200秒,消息会在1200秒后被消费者可见。

场景二

等于0或为空

大于0

消息将按照队列的DelaySeconds值延迟投递。

延时消息生命周期

image

相较于普通消息,延时消息多了一个定时中的状态:

  • 定时中:消息发送到服务端,还未到延时结束时间,此时消息处于定时中状态,对所有消费者不可见。

  • 消息可见:延时时间结束后,消息对所有消费者可见,等待消费者消费的状态。

  • 消息不可见:消费者接收了一条消息后,这条消息会进入不可见状态,意味着其他消费者在此期间无法接收到这条消息。

  • 消息删除:消费者成功消费完消息,调用删除接口后,消息被删除。

监控告警项

对于定时中的消息,轻量消息队列(原 MNS)提供了定时中的消息量(NumberOfMessagesDelayed)的告警项,详情请参见监控项说明