大纲
- 抛弃消息
- 创建最大长度队列
- 绑定
- 实验
- 转存死信
- 创建死信队列
- 创建可重写Routing key的最大长度队列
- 创建绑定关系
- 实验
在一些业务场景中,我们只需要保存最近的若干条消息,这个时候我们就可以使用“最大长度队列”来满足这个需求。该队列在收到消息后,如果达到长度上限,会将队列头部(最早的)的信息从队列中移除。
在进行实验之前,我们先创建一个交换器direct.max.length,用于接收消息。
抛弃消息
创建最大长度队列
我们创建一个名字叫queue.max.length的队列,并且配置属性x-max-length的值为3。这就意味着这条队列最大消息个数是3,超过3个消息时,老消息会被移除。
绑定
我们定义Routing key是to.queue.max.length时,向上述创建的队列queue.max.length发布消息。
实验
我们依次发送消息内容是:1、2、3、4的消息。
但是该队列最多只保存了3条消息
最早的一条消息1被抛弃掉了
转存死信
如果我们不希望消息被抛弃,则可以将其转存到死信中。
转存到死信有两个方案,在《RabbitMQ实践——使用死信机制对异常消息进行处理》中已经有探讨:
- 使用独立的死信交换器
- 重写Routing key
本文我们将使用相对简单的“重写Routing key”方案,这样可以让我们少创建一个交换器。
创建死信队列
我们创建一个用于保存死信的队列queue.dead.letter。没做什么特殊配置。
创建可重写Routing key的最大长度队列
我们创建一个新的队列queue.max.length.with.dead.letter.routing.key。
它制定了下面几个属性
- x-max-length:队列最多保存3条消息。
- x-dead-letter-exchange:使用direct.max.length交换器进行消息路由。这个交换器也是原始消息的交换器。
- x-dead-letter-routing-key:修改从队列顶部移除的消息的Routing key为to.queue.dead.letter,以供交换器路由。
创建绑定关系
在之前案例创建的交换器direct.max.length上,我们将上述队列绑定。
实验
我们使用Routing key:to.queue.max.length.with.dead.letter.routing.key向queue.max.length.with.dead.letter.routing.key队列发送了4条消息,最终它只保存了后3条,最早的一条会被转存到死信队列中。