消息存活时间

更新时间:

本文介绍云消息队列 RabbitMQ 版消息存活时间的核心概念、应用场景、注意事项和设置方式。

什么是消息存活时间

云消息队列 RabbitMQ 版中,消息存活时间用于限制消息在Queue中可以存在的时间,如果消息在Queue中存在的时间超过了设置的消息存活时间,消息将会被进行如下处理:

  • 若您未给Queue设置死信Exchange,消息将被Queue直接丢弃。

  • 若您为Queue设置了死信Exchange,则消息被丢弃后会被转发到死信Exchange,由死信Exchange将其路由到目标Queue。您可以在目标Queue获取该消息。更多信息,请参见死信Exchange

应用场景

消息存活时间可用于保障消息流通性。例如,某应用的消息在某些特定时间会剧烈增加,如果您的业务可以接受消息丢失,您可以通过设置消息存活时间丢弃堆积的消息,从而保障消息流通性。

消息存活时间设置规则

  • 云消息队列 RabbitMQ 版支持通过x-message-ttlexpiration设置消息存活时间,不支持通过rabbitmqctl工具的policy进行设置。

  • 云消息队列 RabbitMQ 版支持在创建Queue时为Queue设置消息存活时间,同时支持在消息发送时为消息设置存活时间。

    如果两个同时设置,则取最小的时间作为消息的存活时间。

  • 延时消息的实际存活时间=min{消息级存活时间, Queue级别存活时间}+延时时间。延时消息的具体信息,请参见延时消息

  • 消息存活时间的取值上限和实例的定时时长一致;且取值必须为非负整型数,单位为毫秒。

  • 如果消息存活时间被设置为0,则消息到达Queue时,除非立即被消费者消费,否则会被立即丢弃或转发到死信Exchange。

设置方式

云消息队列 RabbitMQ 版支持您通过以下方式设置消息存活时间:

  • 云消息队列 RabbitMQ 版控制台

    您可以通过云消息队列 RabbitMQ 版控制台为指定Queue设置消息存活时间。具体操作,请参见Queue管理

  • OpenAPI Explorer

    您可以通过OpenAPI Explorer调用CreateQueue接口,为指定Queue设置消息存活时间。更多信息,请参见CreateQueue

  • 开源RabbitMQ SDK

    您可以通过开源RabbitMQ SDK为指定Queue或某条消息设置消息存活时间。更多信息,请参见SDK列表。示例代码如下:

    • 通过x-message-ttl设置队列级别的消息存活时间

      Map<String, Object> props = new HashMap<String, Object>();
      props.put("x-message-ttl", 1000);
      channel.queueDeclare("myqueue", false, false, false, props);
    • 通过expiration设置消息级别的消息存活时间

      byte[] messageBodyBytes = "test".getBytes();
      AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
              .expiration("1000")
              .build();
      channel.basicPublish("myqueue", peoperties, messageBodyBytes);