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

消息可靠性保障专题

专题说明

本专题聚焦于 RabbitMQ 消息可靠性保障机制,从生产者端、Broker 端到消费者端三个维度全面讲解如何确保消息不丢失,是构建高可靠消息系统的核心知识。

学习目标

  1. 理解并掌握生产者确认机制(Publisher Confirm 和 Publisher Returns)
  2. 掌握消息持久化的配置与实现方式
  3. 掌握消费者手动确认机制及异常处理策略
  4. 能够设计端到端的消息可靠性保障方案

学习建议

建议结合实际代码理解,重点分析各可靠性机制的适用场景和性能影响。

📝 配套习题(20 题)

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

Return 消息机制用于处理消息成功到达交换机但未能匹配到任何队列的情况,生产者需要设置 mandatory=true 才能触发 ReturnCallback。

A

B

2

实现消息端到端不丢失需要组合使用发布确认(Publisher Confirm)、消息持久化(Persistent)和消费者手动确认(Manual Ack)三种机制。

A

B

3

RabbitMQ 原生支持消息去重功能,生产者可以通过设置消息的 message-id 属性让 Broker 自动过滤重复消息。

A

B

4

在 RabbitMQ 消费端,当消费者处理消息抛出异常时,可以通过 basicNack 方法拒绝消息并设置 requeue=true 让消息重新入队重试。

A

B

5

Publisher Confirm 机制中,生产者发布消息到交换机成功后,Broker 会异步发送确认消息给生产者,生产者可以通过 ConfirmCallback 处理确认或拒绝响应。

A

B

单选题
6

ReturnCallback 回调中无法获取以下哪项信息?

A

消息的 routing_key

B

消息的 replyCode(返回码)

C

消息是否已被消费者确认

D

消息的 body 内容

7

以下哪种方案最适合实现 RabbitMQ 消费端的消息去重?

A

依赖 Broker 的 message-id 自动去重

B

在消费端使用 Redis 存储已处理的消息 ID,处理前进行校验

C

将消息内容哈希后与消息体一起发送,Broker 自动去重

D

设置队列的 x-deduplicate 参数为 true

8

以下哪个选项不是实现消息端到端不丢失所必需的机制?

A

Publisher Confirm 机制

B

消息持久化(deliveryMode=2)

C

消费者手动确认(Manual Ack)

D

Fanout 交换机广播

9

消费者处理消息时发生异常,以下哪种做法最适合实现消息重试与失败降级策略?

A

永远不确认消息,让消息一直留在队列中

B

使用 basicNack 拒绝消息并 requeue=true,不做任何限制

C

使用 basicNack 拒绝消息,配合死信队列和重试队列实现有限次重试

D

使用 basicAck 确认消息,即使处理失败

10

在 Publisher Confirm 机制中,生产者如何开启发布确认模式?

A

在队列声明时设置 confirm=true 参数

B

在信道(Channel)上调用 confirmSelect() 方法

C

在交换机声明时设置 confirm=true 参数

D

在连接(Connection)上调用 enableConfirm() 方法

多选题
11

在消费端实现消息去重时,以下哪些做法是正确的?

A

使用消息的唯一 ID 作为去重键

B

将已处理的消息 ID 存储在带过期时间的 Redis 集合中

C

在处理消息前先检查去重缓存,命中则直接确认

D

消息去重缓存应该永久保留,永不删除

12

关于 Return 消息机制,以下哪些说法是正确的?

A

Return 机制处理的是消息到达交换机但未匹配队列的场景

B

mandatory=true 是触发 ReturnCallback 的必要条件

C

ReturnCallback 中可以修改消息并重新发布

D

Return 机制可以替代 Publisher Confirm 机制

13

关于消费端的消息重试与降级策略,以下哪些做法是正确的?

A

在消费者内部维护重试计数器,超过阈值后拒绝消息

B

使用死信队列(DLX)存储多次重试失败的消息

C

消息重试时应使用指数退避策略避免瞬时重试风暴

D

消费端处理异常时应立即关闭连接,防止消息继续投递

14

关于 Publisher Confirm 机制的 ConfirmCallback 回调,以下哪些说法是正确的?

A

ConfirmCallback 中的 ack 表示消息已成功到达交换机

B

ConfirmCallback 中的 nack 表示消息未到达交换机,可以重发

C

ConfirmCallback 是同步阻塞回调,会等待 Broker 响应

D

批量发布多条消息时,Broker 可能会批量返回确认

填空题
15

当消息到达交换机但未匹配到任何队列时,需要设置 mandatory=____________ 才能触发 ____________ 将消息返回给生产者进行处理。

16

消费者处理消息失败时,可以通过 basicNack 拒绝消息并设置 requeue=____________ 使消息重新入队。为了避免无限重试,通常配合 ____________ 实现有限次数的消息降级处理。

17

消费端消息去重通常使用消息的 ____________ 作为去重键,在处理消息前通过查询 ____________ (如 Redis)判断是否已处理,若已处理则直接确认消息。

18

在生产者中开启 Publisher Confirm 机制需要调用信道的 ____________ 方法。当消息成功到达交换机时,ConfirmCallback 会返回 ____________ 状态;当消息未到达时返回 nack 状态。

简答题
19

请说明消费端消息去重的实现原理,以及在实际应用中需要考虑的关键因素(如缓存过期、并发处理等)。

20

请简述 Publisher Confirm 机制的完整工作流程,以及当收到 nack 确认时生产者应该如何处理。

参考答案
1.正确 2.正确 3.错误 4.正确 5.正确 6.C 7.B 8.D 9.C 10.B 11.A;B;C 12.A;B;C 13.A;B;C 14.A;B;D 15.true;ReturnCallback 16.true;死信队列 17.唯一ID;去重缓存 18.confirmSelect;ack 19. 20.
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 消息发送与接收专题
下一个专题 → 消息序列化与格式专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码