TTL是什么?
TTL(time to live)消息的存活时间,在学习Redis的时候我们也学过相关概念,在RabbitMQ中指的是我们给消息模型中的某个队列或者某个消息设置的过期时间。
在RabbitMQ中支持两种设置TTL的方式
1.给队列进行ttl设置
可以使用x-message-ttl参数设置当前队列中所有消息的过期时间,即当前队列中所有的消息过期时间都一样;
2.单独给某条消息设置ttl(生产环境中居多)
可以使用Expiration参数来设置单个消息的过期时间。当时间一到就会被移出队列。
如果在一次设置中我们同时设置了两种消息过期方式和的话,时间段的会优先触发,比如,我们给某个队列设置过期时间为5秒,所有发到这个队列的消息5秒内未被消费都会过期,我们同时又给某个消息设置过期时间为3秒,则在消息发送到队列中3秒后就会过期。
死信队列是什么?
一般来说当消息过期是因为我们没有及时的去消费他,但是我们也不想他就这样消失了,所以RabbitMQ中引入了死信队列的概念。当未被及时消费的消息就会被移入死信队列,死信,在官网中对应的单词为“Dead Letter”,是RabbitMQ中的一种消息机制
死信队列中的消息
消息被丢到私信队列中后发生了什么呢?
如果队列配置了参数 x-dead-letter-routing-key 的话,“死信”的路由key将会被替换成该参数对应的值。如果没有设置,则保留该消息原有的路由key。
比如,如果原有消息的路由key是A,被发送到业务Exchage中,然后被投递到业务队列QueueA中,如果该队列没有配置参数x-dead-letter-routing-key,则该消息成为死信后,将保留原有的路由keytestA,如果配置了该参数,并且值设置为B,那么该消息成为死信后,路由key将会被替换为B,然后被抛到死信交换机中。
一般我们怎么使用呢,比如,如果你在网上购物的话,他会给你生成一个订单,让你30分钟内进行支付确认,如果30分钟未支付,这条消息就会被丢进死信队列,等待后一步的操作。