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

死信队列与延迟队列专题

专题说明

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

学习目标

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

学习建议

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

📝 配套习题(20 题)

💡 参考答案在文末
判断题
1

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

A

B

2

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

A

B

3

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

A

B

单选题
4

在 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);

5

使用延迟队列插件发送延迟消息时,以下哪个代码片段能正确设置消息延迟 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());

6

关于 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 过期的消息会被直接丢弃,不会进入死信队列

7

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

A

直接清空死信队列,避免占用过多磁盘空间

B

先分析死信原因,修复问题后重新发布消息或进行补偿处理

C

将所有死信消息原样重新发布到原业务队列

D

增大死信队列的 TTL,让消息自动过期删除

8

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

A

DLX 是一种特殊类型的交换机,只能绑定一个队列

B

消息进入 DLX 后,会根据 DLX 的路由规则转发到绑定的队列

C

只有被消费者拒绝的消息才会通过 DLX 转发

D

DLX 必须由管理员手动创建,RabbitMQ 不会自动处理

9

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

A

在补偿逻辑中检查消息的 x-death 次数,超过阈值则丢弃

B

使用消息 ID 作为业务幂等键,在补偿前检查是否已处理过

C

将死信消息直接删除,不进行补偿

D

每次补偿时修改消息内容并重新发送到死信队列

10

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

A

delayed

B

directfanouttopic(即底层路由类型)

C

x-delay

D

x-delayed-message

多选题
11

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

A

x-death 是一个列表类型,记录消息每次进入死信队列的信息

B

x-death 中的 reason 字段取值为 rejectedexpiredmaxlen

C

x-death 中的 queue 字段记录消息从哪个队列被转发为死信

D

消息多次进入死信队列时,x-death 列表只保留最后一次记录

12

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

A

消费者调用 basicNack(deliveryTag, false, false) 拒绝消息

B

消息在队列中等待的时间超过了队列的 x-message-ttl 设置

C

队列的消息数量达到了 x-max-length 限制,最早的消息被溢出

D

消费者调用 basicAck(deliveryTag, false) 确认消息

13

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

A

业务队列(配置 x-dead-letter-exchange 参数)

B

死信交换机(DLX)

C

死信队列(绑定到 DLX)

D

业务交换机

14

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

A

插件方案的延迟消息存储在交换机内存中,不会进入队列,TTL+DLX 方案的延迟消息先入普通队列等待过期

B

插件方案支持在运行时动态修改消息的延迟时间,TTL+DLX 方案不支持

C

插件方案的消息排序行为由插件内部实现控制,TTL+DLX 方案的消息按过期时间先后顺序进入死信队列

D

插件方案无需额外声明死信交换机和死信队列,TTL+DLX 方案需要

15

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

A

RabbitMQ 只在消息到达队列头部时才检查和过期该消息

B

消息级 TTL 过期的消息即使不在队列头部,也会被立即移除

C

设置消息级 TTL 时,所有消息的过期时间必须单调递增

D

队列级 TTL 通过后台定时扫描实现,不依赖消息位置

16

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

A

需要声明一个"延迟队列"(设置 TTL 和 DLX)和一个"业务队列"(接收到期消息)

B

延迟队列中不需要消费者,消息到期后自动转发到业务队列

C

同一延迟队列中消息的 TTL 必须单调递增,否则延迟时间会错乱

D

可以为不同的延迟时间(5分钟、10分钟、30分钟)创建多个延迟队列来实现分级延迟

填空题
17

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

18

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

19

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

20

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

参考答案
1.错误 2.错误 3.错误 4.A 5.C 6.B 7.B 8.B 9.B 10.B 11.A;B;C 12.A;B;C 13.A;B;C 14.A;C;D 15.A;D 16.A;B;C;D 17.原队列名称;x-dead-letter-routing-key 18."dlx.exchange";"dlx.rk" 19.Queues 标签;HTTP API/Management Plugin;重新发布到原业务队列/调用补偿接口 20.expiration;60000;60 秒
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 核心概念入门专题
下一个专题 → 消息发送与接收专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码