消息队列 AMQP 版的延时消息可以在指定时间段之后才可被消费者消费,适用于对消息生产和消费有时间窗口要求或者利用消息触发延时任务的场景。本文介绍延时消息的核心概念、适用场景、配置方式和注意事项。

核心概念

Producer 将消息发送到消息队列 AMQP 版服务端,但并不期望这条消息立马投递,而是延迟一定时间后才投递到 Consumer 进行消费,该消息即延时消息。

适用场景

延时消息适用于以下场景:

  • 对消息生产和消费有时间窗口要求

    例如,在电商交易中超时未支付关闭订单的场景,在订单创建时会发送一条延时消息。这条消息将会在 30 分钟以后投递给消费者,消费者收到此消息后需要判断对应的订单是否已完成支付。如支付未完成,则关闭订单。如已完成支付则忽略。

  • 通过消息触发延时任务

    例如,在指定时间段之后向用户发送提醒消息。

配置方式

发送延时消息需要设置一个延时时间长度,消息将从当前发送时间点开始延迟固定时间之后才开始投递。如果需要延时发送消息,您可以设置 BasicPropertiesheader 属性,单位为毫秒。例如,header.put("delay", "1000") 代表发送消息的延迟时间为 1000 毫秒。Java 示例代码如下:

Map<String, Object> headers = new HashMap<>();
headers.put("delay", "xx"); //xx为消息的延迟时间(毫秒)
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().messageId(UUID.randomUUID().toString()).headers(headers).build();

其他语言示例代码请参见 AMQP Demos

注意事项

  • 延时时间的值必须为非负整数。
  • 延时时间的最大值为 86400000,即 1 天。若延时时间超过限制,则当作普通消息处理。
  • 延时消息是消息队列 AMQP 版的高级特性消息,此类消息将以普通消息价格的 5 倍计费。

    示例:一条延时消息,发布消息 1 次,订阅消息 1 次,按照 5 + 5 = 10 次 API 请求计费。