轻量消息队列(原 MNS)提供队列级别和消息级别的延时功能,本文为您介绍延时功能的典型应用场景、生效规则和使用方法。
应用场景
典型场景一:分布式定时调度
在分布式定时调度场景下,需要实现各类精度的定时任务,例如每天05:00执行文件清理,每隔2分钟触发一次消息推送等需求。传统基于数据库的定时调度方案在分布式场景下性能不高、实现复杂。基于轻量消息队列(原 MNS)的延时消息可以封装出多种类型的定时触发器。
典型场景二:任务超时处理
以电商交易场景为例,订单下单后暂未支付,此时不可以直接关闭订单,而是需要等待一段时间后才能关闭订单。使用轻量消息队列(原 MNS)延时消息可以实现超时任务的检查触发。
基于延时消息的超时任务处理具备如下优势:
精度高、开发门槛低:基于消息通知方式不存在定时阶梯间隔。可以轻松实现任意精度事件触发,无需业务去重。
高性能可扩展:传统的数据库扫描方式较为复杂,需要频繁调用接口扫描,容易产生性能瓶颈。轻量消息队列(原 MNS)的定延时消息具有高并发和水平扩展的能力。
功能说明
轻量消息队列(原 MNS)提供队列级别和消息级别的延时功能。
队列级别延时消息
创建队列时,设置消息延时时间(DelaySeconds
)属性值,发送到本队列的所有消息默认将以本参数指定的时间被延后消费。
单位:秒。
取值:0~604800秒,即0秒至7天。
消息级别延时消息
创建消息时,设置消息延时时间(DelaySeconds
)属性值,这条消息将以本参数指定的时间被延后消费。
单位:秒。
取值:0~604800秒,即0秒至7天。
设置生效规则
当消息的DelaySeconds
值大于0时,消息级别的延迟设置优先于队列级别的延迟设置生效,这意味着,当一条消息具有特定的延迟属性时,该属性将覆盖队列配置中定义的延迟策略。
详细规则如下表所示:
场景 | 消息的DelaySeconds值 | 队列的DelaySeconds值 | 生效规则 |
场景一 | 大于0 | 大于等于0 | 消息级别的延迟设置优先于队列级别的延迟设置生效。 例如设置队列
|
场景二 | 等于0或为空 | 大于0 | 消息将按照队列的 |
延时消息生命周期
相较于普通消息,延时消息多了一个定时中的状态:
定时中:消息发送到服务端,还未到延时结束时间,此时消息处于定时中状态,对所有消费者不可见。
消息可见:延时时间结束后,消息对所有消费者可见,等待消费者消费的状态。
消息不可见:消费者接收了一条消息后,这条消息会进入不可见状态,意味着其他消费者在此期间无法接收到这条消息。
消息删除:消费者成功消费完消息,调用删除接口后,消息被删除。
监控告警项
对于定时中的消息,轻量消息队列(原 MNS)提供了定时中的消息量(NumberOfMessagesDelayed
)的告警项,详情请参见监控项说明。