引言
之前写了一个rabbitmq的入门,也是自己看的一些入门资料,但是感觉在面试的时候还是不太够用,这次打算进一步的整理一下死信队列和延迟队列
1, 死信队列
死信,是指在某些情况下,无法被消费
1、 队列消息长度到达限制;
2、 消费者异常拒接消费消息;
3、 原队列存在消息过期设置,消息到达超时时间未被消费
具体处理,在产生死信的时候,死信会被投放到死信交换机,进入到死信队列
2,延迟队列
延迟队列,消息进入到队列之后不会立刻消费,而是会等待一段时间之后再进行消费
由于AMQP和RabbitmQ本身都没有实现延迟队列,所以如果要使用延迟队列的话,就要手动实现一个延迟队列
TTL实现延迟队列
发送带有TTL
过期属性的消息,到达过期时间之后,投递到死信队列,实现延迟队列的功能,但是这样的实现还是有问题,当消息过期的时候,不会立马从队列中抹除,每条消息是否过期是在即将投递到消费之之前判断的,rabbitmq
是等消息到达队列顶部即将被消费时,才会判断其是否过期并删除。所以即使消息过期,也不会马上从队列中抹除。
比如投递一条过期时间为50秒的消息,紧接着投递一条过期时间为40秒的信息当第二条消息已经过期,第一条消息还未过期,等第一条过期之后,队列才会扫描到第二条过期信息,这样在实际的业务应用中就会出现问题。
过期队列实现延迟队列
设置一个队列,给整个队列设置过期时间
但是这样的问题就是不够灵活,如果给某个队列设置了过期时间为10分钟,那么如果有一个消息的过期时间为30分钟,就要重新设置一个队列,让这个队列的过期时间为30分钟
利用插件实现延迟队列
消息到达延迟交换机
后,消息不会立即进入队列,先将消息保存至表中,插件将会尝试确认消息是否过期,如果消息过期则投递至目标队列。
这种是实际最常使用的一种方式,大多数MQ都是这样实现延迟队列的,下一篇准备写一下怎么用Redis
实现延迟队列。