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

实现原理

  • RabbitMQ延时消息
    RabbitMQ原生不支持延时消息。如果您要实现延时消息,可以采用以下方式:
  • 消息队列AMQP版延时消息

    消息队列AMQP版原生支持延时消息。您无需结合两种特性或是下载插件来实现延时消息,您只需要在发送消息时设置消息的延迟时间。详情请参见使用方式

适用场景

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

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

    例如,在电商交易中超时未支付关闭订单的场景,在订单创建时会发送一条延时消息。这条消息将会在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请求计费。