RabbitMQ实践——最大长度队列

在一些业务场景中,我们只需要保存最近的若干条消息,这个时候我们就可以使用“最大长度队列”来满足这个需求。该队列在收到消息后,如果达到长度上限,会将队列头部(最早的)的信息从队列中移除。
在进行实验之前,我们先创建一个交换器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条,最早的一条会被转存到死信队列中。
在这里插入图片描述
在这里插入图片描述

### RabbitMQ 消息队列模型详解 #### 生产者与消费者模式 在 RabbitMQ 中,生产者负责创建并发送消息至交换器(Exchange),而消费者则订阅特定的队列来接收这些消息。这种架构使得生产和消费过程解耦合,提高了系统的灵活性和可扩展性[^1]。 #### 交换器(Exchange) 交换器是连接生产者和队列的关键组件之一。当一条新消息被发布到 RabbitMQ 后,会先到达某个指定类型的交换器上;之后依据绑定关系及路由键规则转发给相应的队列。常见的交换器类型有: - **Direct Exchange**: 只能匹配完全相同的路由键; - **Fanout Exchange**: 广播形式分发所有接收到的消息给每一个与其关联的目标队列- **Topic Exchange**: 支持通配符机制下的模糊匹配方式决定目标队列- **Headers Exchange**: 不依赖于路由键而是基于消息头部属性进行筛选[^2]。 #### 队列(Queue) 队列存储着等待处理的数据项直到它们被成功传递给至少一个注册过的监听程序即消费者为止。每个队列都有唯一的名称,并且可以配置持久化选项以确保即使服务器重启也不会丢失未确认的消息。此外还支持设置最大长度限制等功能特性[^3]。 #### 绑定(Binding) 为了使交换机能知道应该把消息送到哪些具体的队列里去,则需要建立两者间的联系——这就是所谓的“绑定”。通过定义不同的路由键或条件表达式可以让同一个交换器向多个不同目的地点派送数据副本,反之亦然也可以让单个队列接受来自多处源头的信息流输入。 ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明exchange, queue 和 binding key channel.exchange_declare(exchange='logs', exchange_type='fanout') result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue channel.queue_bind(exchange='logs', queue=queue_name) def callback(ch, method, properties, body): print(f" [x] Received {body}") channel.basic_consume( queue=queue_name, on_message_callback=callback, auto_ack=True) print(' [*] Waiting for logs. To exit press CTRL+C') channel.start_consuming() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breaksoftware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值