全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📝 1 篇文章 20 道配套习题

死信队列与延迟队列专题

专题说明

本专题系统讲解 RabbitMQ 死信队列和延迟队列的实现原理与应用场景,包括消息 TTL 设置、死信交换机配置、延迟队列实现方案等核心内容。

学习目标

  1. 理解死信消息的触发条件与处理流程
  2. 掌握死信交换机的配置与使用方法
  3. 掌握延迟队列的两种实现方式(TTL+DLX 与延迟交换机插件)
  4. 能够设计基于死信队列和延迟队列的业务解决方案

学习建议

建议结合实际业务场景(如订单超时取消、延迟通知等)理解死信队列和延迟队列的应用。

📝 发现内容有误?点击此处直接编辑

📝 配套习题(20 题)

1
判断题

rabbitmq-delayed-message-exchange 是 RabbitMQ 官方内置的插件,无需额外安装即可直接使用。

A

B

2
单选题

使用 rabbitmq-delayed-message-exchange 插件时,声明延迟交换机需要设置的 x-delayed-type 参数值应该是什么?

A. delayed B. directfanouttopic(即底层路由类型) C. x-delay D. x-delayed-message

3
单选题

使用延迟队列插件发送延迟消息时,以下哪个代码片段能正确设置消息延迟 30 秒?

A. channel.basicPublish(exchange, routingKey, null, messageBody.getBytes()); B. AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().expiration("30000").build(); channel.basicPublish(exchange, routingKey, props, messageBody.getBytes()); C. Map<String, Object> headers = new HashMap<>(); headers.put("x-delay", 30000); AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().headers(headers).build(); channel.basicPublish(exchange, routingKey, props, messageBody.getBytes()); D. Map<String, Object> headers = new HashMap<>(); headers.put("x-delay", 30); AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().headers(headers).build(); channel.basicPublish(exchange, routingKey, props, messageBody.getBytes());

4
多选题

对比 rabbitmq-delayed-message-exchange 插件方案与传统 TTL+DLX 方案实现延迟队列,以下说法正确的有哪些?

A. 插件方案的延迟消息存储在交换机内存中,不会进入队列,TTL+DLX 方案的延迟消息先入普通队列等待过期 B. 插件方案支持在运行时动态修改消息的延迟时间,TTL+DLX 方案不支持 C. 插件方案的消息排序行为由插件内部实现控制,TTL+DLX 方案的消息按过期时间先后顺序进入死信队列 D. 插件方案无需额外声明死信交换机和死信队列,TTL+DLX 方案需要

5
单选题

当发现死信队列中积累了大量消息时,以下处理流程最合理的是:

A. 直接清空死信队列,避免占用过多磁盘空间 B. 先分析死信原因,修复问题后重新发布消息或进行补偿处理 C. 将所有死信消息原样重新发布到原业务队列 D. 增大死信队列的 TTL,让消息自动过期删除

6
多选题

关于死信消息的 x-death header,以下说法正确的有哪些?

A. x-death 是一个列表类型,记录消息每次进入死信队列的信息 B. x-death 中的 reason 字段取值为 rejectedexpiredmaxlen C. x-death 中的 queue 字段记录消息从哪个队列被转发为死信 D. 消息多次进入死信队列时,x-death 列表只保留最后一次记录

7
填空题

监控死信队列的两种常用方式是:通过 RabbitMQ 管理界面的 ___________ 查看队列消息堆积情况,以及通过 ________________________ 编程化获取队列指标。当需要对死信消息进行补偿处理时,通常采用消费死信队列消息并 ________________________ 的方式实现。

8
单选题

在实现死信消息补偿处理时,以下哪种做法能有效避免消息被重复补偿导致的数据不一致?

A. 在补偿逻辑中检查消息的 x-death 次数,超过阈值则丢弃 B. 使用消息 ID 作为业务幂等键,在补偿前检查是否已处理过 C. 将死信消息直接删除,不进行补偿 D. 每次补偿时修改消息内容并重新发送到死信队列

9
单选题

关于死信交换机(DLX),以下说法正确的是:

A. DLX 是一种特殊类型的交换机,只能绑定一个队列 B. 消息进入 DLX 后,会根据 DLX 的路由规则转发到绑定的队列 C. 只有被消费者拒绝的消息才会通过 DLX 转发 D. DLX 必须由管理员手动创建,RabbitMQ 不会自动处理

10
多选题

以下哪些场景会导致消息成为死信(Dead Letter)?

A. 消费者调用 basicNack(deliveryTag, false, false) 拒绝消息 B. 消息在队列中等待的时间超过了队列的 x-message-ttl 设置 C. 队列的消息数量达到了 x-max-length 限制,最早的消息被溢出 D. 消费者调用 basicAck(deliveryTag, false) 确认消息

11
判断题

死信交换机(DLX)必须是 direct 类型的交换机,不能使用 fanouttopic 类型。

A

B

12
填空题

消息被转发到死信交换机时,默认使用的路由键是 __________ 。如果希望自定义死信路由键,可以通过配置队列的 ________________________ 参数来覆盖默认行为。

13
单选题

在 Java 客户端中,以下哪种代码能正确配置队列的死信交换机?

A. channel.queueDeclare("my.queue", true, false, false, Collections.singletonMap("x-dead-letter-exchange", "dlx.exchange")); B. channel.exchangeDeclare("my.queue", "direct", true); channel.queueBind("my.queue", "dlx.exchange", ""); C. channel.queueDeclare("my.queue", true, false, false, Collections.singletonMap("dead-letter-exchange", "dlx.exchange")); D. channel.basicConsume("my.queue", true, consumer);

14
多选题

一个完整的死信队列配置通常需要声明哪些组件?

A. 业务队列(配置 x-dead-letter-exchange 参数) B. 死信交换机(DLX) C. 死信队列(绑定到 DLX) D. 业务交换机

15
填空题

在 Spring AMQP 中,通过 QueueBuilder 配置死信队列的代码模板为:QueueBuilder.durable("businessQueue").withArgument("x-dead-letter-exchange", ________________________).withArgument("x-dead-letter-routing-key", __________________).build()

16
判断题

已经声明的队列可以通过 queueDeclare 方法重新调用并修改 x-dead-letter-exchange 参数来动态更新死信配置。

A

B

17
单选题

关于 RabbitMQ 的 TTL(Time-To-Live)机制,以下说法正确的是:

A. 队列级 TTL(x-message-ttl)和消息级 TTL(expiration)同时设置时,以消息级 TTL 为准 B. 队列级 TTL(x-message-ttl)和消息级 TTL(expiration)同时设置时,以两者中较小的值为准 C. 消息级 TTL 可以设置得比队列级 TTL 更长,消息会在消息级 TTL 到期后才过期 D. TTL 过期的消息会被直接丢弃,不会进入死信队列

18
多选题

关于 RabbitMQ 中 TTL 消息的过期行为,以下说法正确的有哪些?

A. RabbitMQ 只在消息到达队列头部时才检查和过期该消息 B. 消息级 TTL 过期的消息即使不在队列头部,也会被立即移除 C. 设置消息级 TTL 时,所有消息的过期时间必须单调递增 D. 队列级 TTL 通过后台定时扫描实现,不依赖消息位置

19
填空题

在 Java 客户端中设置消息级 TTL 的代码为:AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().__________("______").build(); 表示该消息将在 ______ 后过期。

20
多选题

使用 TTL + DLX 模式实现延迟队列时,以下说法正确的有哪些?

A. 需要声明一个"延迟队列"(设置 TTL 和 DLX)和一个"业务队列"(接收到期消息) B. 延迟队列中不需要消费者,消息到期后自动转发到业务队列 C. 同一延迟队列中消息的 TTL 必须单调递增,否则延迟时间会错乱 D. 可以为不同的延迟时间(5分钟、10分钟、30分钟)创建多个延迟队列来实现分级延迟

← 上一个专题 核心概念入门专题
下一个专题 → 消息发送与接收专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库