欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > RabbitMQ的死信队列和ttl

RabbitMQ的死信队列和ttl

2025/4/18 13:17:11 来源:https://blog.csdn.net/2202_75439262/article/details/147102301  浏览:    关键词:RabbitMQ的死信队列和ttl

TTL

ttl即过期时间,rbbitmq可以对队列和消息设置过期时间,当消息到存活时间之后,还没有被消费,就会被自动清除

例如:在网上购物,经常会遇到一个场景,当下单超过24小时还未付款,订单就自动取消

或者申请退款之后,超过7天未处理就自动退款

设置消息的ttl

有两种方式:

一是设置队列的TTL,队列中的所有消息都有相同的我过期时间,二是对消息本身进行单独设置,每条消息的TTL可以不同,如果两种同时使用则取两者间最小的那个数值。

发送消息:

@RequestMapping("/ttl")public String ttl() {String ttlTime = "10000";rabbitTemplate.convertAndSend(Constants.TTL_EXCHANGE,"","ttl test...", message -> {message.getMessageProperties().setExpiration(ttlTime);return message;});return "success";}

设置时间为十秒,单位为毫秒。10秒内没有消费者消费就过期

设置队列的ttl

设置队列的TTL的方法是在创建队列时,加入x-message-ttl参数实现,单位也是毫秒

//设置队列的ttl@Bean("ttlQueue2")public Queue ttlQueue2() {return QueueBuilder.durable(Constants.TTL_QUEUE2).ttl(20000).build();}@Bean("ttlQueue2")public Queue ttlQueue3() {Map<String,Object> arguments = new HashMap<>();arguments.put("x-message-ttl",20000);//另外一种创建队列过期时间的方法return QueueBuilder.durable(Constants.TTL_QUEUE2).withArguments(arguments).build();}

 

ttl_queue2 队列有ttl标识,在20秒之后ttl_queue2消息过期,ttl_queue的消息没有被删除

两者区别:

设置队列TTL的方法,一旦消息过期,就会从队列中删除,

设置消息TTL的方法,即使消息过期也不会马上从队列中删除,而是在即将投递到消费者之前进行判定删除

为什么处理方法不一样?

因为设置队列过期时间,队列中已过期的消息肯定在队列头部,RabbitMQ只需要定期在队头扫描是否有过期的消息即可

而设置消息TTL的方式,每条消息的过期时间不同,如果要删除所有过期的消息需要扫描整个队列,所有不如等到消息要被消费者消费之前再判定过期,再进行删除即可。

死信队列

死信就是因为种种原因无法被消费的消息,就是死信。

有死信,自然就有死信队列,当一个消息在一个队列中变成死信之后,它能被重新发送到另外一个交换机中,这个交换机叫做死信交换机(DLX),而和DLX绑定的队列就叫做死信队列(DLQ)

这个图也很形象的表示了我们死信队列该如何创建。

消息变成死信的几种情况:

1.消息被拒绝(Basic.Reject/Basic.Nack),并且重新入队被设置为false。

2.消息过期

3.队列达到最大长度。

配置:

@Bean("dlxExchange")public Exchange dlxExchange() {return ExchangeBuilder.topicExchange(Constants.DLX_EXCHANGE).durable(true).build();}@Bean("dlqQueue")public Queue dlqQueue() {return QueueBuilder.durable(Constants.DLQ_QUEUE).build();}@Bean("dlxBinding")public Binding dlxBinding(@Qualifier("dlxExchange") Exchange exchange, @Qualifier("dlqQueue") Queue queue) {return BindingBuilder.bind(queue).to(exchange).with("dlx").noargs();}//正常交换机@Bean("normalExchange")public Exchange normalExchange() {return ExchangeBuilder.directExchange(Constants.NORMAL_EXCHANGE).durable(true).build();
@Bean("normalBinding")public Binding normalBinding(@Qualifier("normalExchange") Exchange exchange, @Qualifier("normalQueue") Queue queue) {return BindingBuilder.bind(queue).to(exchange).with("normal").noargs();}
@Bean("normalQueue")public Queue normalQueue(){return QueueBuilder.durable(Constants.NORMAL_QUEUE).deadLetterExchange(Constants.DLX_EXCHANGE).deadLetterRoutingKey("dlx").ttl(10000)//三种变成死信的情况.maxLength(10L).build();}

发送消息

@RequestMapping("/dlx")public String dlx() {rabbitTemplate.convertAndSend(Constants.NORMAL_EXCHANGE,"normal","dlx test...");return "success";}

解释一下红框

D:durable

TTL: 过期时间

DLX:该队列设置了死信交换机

DLK:该队列设置了死信Routingkey

预期是发送消息到normal_queue然后十秒中未消费到dlq.queue队列

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词