死信队列与延迟队列专题
专题说明
本专题系统讲解 RabbitMQ 死信队列和延迟队列的实现原理与应用场景,包括消息 TTL 设置、死信交换机配置、延迟队列实现方案等核心内容。
学习目标
- 理解死信消息的触发条件与处理流程
- 掌握死信交换机的配置与使用方法
- 掌握延迟队列的两种实现方式(TTL+DLX 与延迟交换机插件)
- 能够设计基于死信队列和延迟队列的业务解决方案
学习建议
建议结合实际业务场景(如订单超时取消、延迟通知等)理解死信队列和延迟队列的应用。
📝 发现内容有误?点击此处直接编辑
本专题系统讲解 RabbitMQ 死信队列和延迟队列的实现原理与应用场景,包括消息 TTL 设置、死信交换机配置、延迟队列实现方案等核心内容。
建议结合实际业务场景(如订单超时取消、延迟通知等)理解死信队列和延迟队列的应用。
📝 发现内容有误?点击此处直接编辑
rabbitmq-delayed-message-exchange 是 RabbitMQ 官方内置的插件,无需额外安装即可直接使用。
使用 rabbitmq-delayed-message-exchange 插件时,声明延迟交换机需要设置的 x-delayed-type 参数值应该是什么?
A. delayed
B. direct、fanout 或 topic(即底层路由类型)
C. x-delay
D. x-delayed-message
使用延迟队列插件发送延迟消息时,以下哪个代码片段能正确设置消息延迟 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());
对比 rabbitmq-delayed-message-exchange 插件方案与传统 TTL+DLX 方案实现延迟队列,以下说法正确的有哪些?
A. 插件方案的延迟消息存储在交换机内存中,不会进入队列,TTL+DLX 方案的延迟消息先入普通队列等待过期 B. 插件方案支持在运行时动态修改消息的延迟时间,TTL+DLX 方案不支持 C. 插件方案的消息排序行为由插件内部实现控制,TTL+DLX 方案的消息按过期时间先后顺序进入死信队列 D. 插件方案无需额外声明死信交换机和死信队列,TTL+DLX 方案需要
当发现死信队列中积累了大量消息时,以下处理流程最合理的是:
A. 直接清空死信队列,避免占用过多磁盘空间 B. 先分析死信原因,修复问题后重新发布消息或进行补偿处理 C. 将所有死信消息原样重新发布到原业务队列 D. 增大死信队列的 TTL,让消息自动过期删除
关于死信消息的 x-death header,以下说法正确的有哪些?
A. x-death 是一个列表类型,记录消息每次进入死信队列的信息
B. x-death 中的 reason 字段取值为 rejected、expired 或 maxlen
C. x-death 中的 queue 字段记录消息从哪个队列被转发为死信
D. 消息多次进入死信队列时,x-death 列表只保留最后一次记录
监控死信队列的两种常用方式是:通过 RabbitMQ 管理界面的 ___________ 查看队列消息堆积情况,以及通过 ________________________ 编程化获取队列指标。当需要对死信消息进行补偿处理时,通常采用消费死信队列消息并 ________________________ 的方式实现。
在实现死信消息补偿处理时,以下哪种做法能有效避免消息被重复补偿导致的数据不一致?
A. 在补偿逻辑中检查消息的 x-death 次数,超过阈值则丢弃
B. 使用消息 ID 作为业务幂等键,在补偿前检查是否已处理过
C. 将死信消息直接删除,不进行补偿
D. 每次补偿时修改消息内容并重新发送到死信队列
关于死信交换机(DLX),以下说法正确的是:
A. DLX 是一种特殊类型的交换机,只能绑定一个队列 B. 消息进入 DLX 后,会根据 DLX 的路由规则转发到绑定的队列 C. 只有被消费者拒绝的消息才会通过 DLX 转发 D. DLX 必须由管理员手动创建,RabbitMQ 不会自动处理
以下哪些场景会导致消息成为死信(Dead Letter)?
A. 消费者调用 basicNack(deliveryTag, false, false) 拒绝消息
B. 消息在队列中等待的时间超过了队列的 x-message-ttl 设置
C. 队列的消息数量达到了 x-max-length 限制,最早的消息被溢出
D. 消费者调用 basicAck(deliveryTag, false) 确认消息
死信交换机(DLX)必须是 direct 类型的交换机,不能使用 fanout 或 topic 类型。
消息被转发到死信交换机时,默认使用的路由键是 __________ 。如果希望自定义死信路由键,可以通过配置队列的 ________________________ 参数来覆盖默认行为。
在 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);
一个完整的死信队列配置通常需要声明哪些组件?
A. 业务队列(配置 x-dead-letter-exchange 参数)
B. 死信交换机(DLX)
C. 死信队列(绑定到 DLX)
D. 业务交换机
在 Spring AMQP 中,通过 QueueBuilder 配置死信队列的代码模板为:QueueBuilder.durable("businessQueue").withArgument("x-dead-letter-exchange", ________________________).withArgument("x-dead-letter-routing-key", __________________).build() 。
已经声明的队列可以通过 queueDeclare 方法重新调用并修改 x-dead-letter-exchange 参数来动态更新死信配置。
关于 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 过期的消息会被直接丢弃,不会进入死信队列
关于 RabbitMQ 中 TTL 消息的过期行为,以下说法正确的有哪些?
A. RabbitMQ 只在消息到达队列头部时才检查和过期该消息 B. 消息级 TTL 过期的消息即使不在队列头部,也会被立即移除 C. 设置消息级 TTL 时,所有消息的过期时间必须单调递增 D. 队列级 TTL 通过后台定时扫描实现,不依赖消息位置
在 Java 客户端中设置消息级 TTL 的代码为:AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().__________("______").build(); 表示该消息将在 ______ 后过期。
使用 TTL + DLX 模式实现延迟队列时,以下说法正确的有哪些?
A. 需要声明一个"延迟队列"(设置 TTL 和 DLX)和一个"业务队列"(接收到期消息) B. 延迟队列中不需要消费者,消息到期后自动转发到业务队列 C. 同一延迟队列中消息的 TTL 必须单调递增,否则延迟时间会错乱 D. 可以为不同的延迟时间(5分钟、10分钟、30分钟)创建多个延迟队列来实现分级延迟
📝 发现内容有误?点击此处直接编辑
长按或扫描二维码,立即体验