死信和TTL
更新時間 2023-07-03 21:29:51
最近更新時間: 2023-07-03 21:29:51
分享文章
介紹 分布式消息服務RabbitMQ死信和TTL功能。
死信
稱為死信的信息,需要如下幾個條件:
- 消息被消費者拒絕(通過basic.reject 或者 back.nack),并且設置 requeue=false。
- 消息過期,隊列設置了TTL(Time To Live)時間并且消息過期。
- 超過了隊列的長度限制消息被丟棄。
- 為隊列配置死信交換機,并在申明隊列時指定“x-dead-letter-exchange”和“x-dead-letter-routing-key”參數。隊列根據“x-dead-letter-exchange”將死信消息發送到死信交換機中,并根據“x-dead-letter-routing-key”為死信消息設置死信路由Key。
以下示例演示在Java客戶端配置死信交換機和路由
channel.exchangeDeclare("some.exchange.name", "direct");
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-dead-letter-exchange", "some.exchange.name");
args.put("x-dead-letter-routing-key", "some-routing-key");
channel.queueDeclare("myqueue", false, false, false, args);
TTL
RabbitMQ可以對消息和隊列設置TTL. 目前有兩種方法可以設置。第一種方法是通過隊列屬性設置,隊列中所有消息都有相同的過期時間。第二種方法是對消息進行單獨設置,每條消息TTL可以不同。如果上述兩種方法同時使用,則消息的過期時間以兩者之間TTL較小的那個數值為準。消息在隊列的生存時間一旦超過設置的TTL值,就稱為dead message, 消費者將無法再收到該消息。
設置隊列TTL
通過隊列屬性設置消息TTL的方法是在queue.declare方法中加入x-message-ttl參數,單位為ms.
以下示例演示在Java客戶端設置隊列TTL。
Map<String, Object> argss = new HashMap<String, Object>();
argss.put("x-message-ttl",6000);
channel.queueDeclare(queueName, durable, exclusive, autoDelete, argss);
設置消息TTL
針對每條消息設置TTL的方法是在basic.publish方法中加入expiration的屬性參數,單位為ms.
以下示例演示在Java客戶端通過隊列屬性設置消息TTL。
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.deliveryMode(2);
builder.expiration("6000");
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName,routingKey,mandatory,properties,"ttlTestMessage".getBytes());