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

消费者模式与并发专题

专题说明

本专题系统讲解 RabbitMQ 消费者的各种工作模式及并发处理机制,包括预取值调优、多线程消费、批量处理等核心内容,帮助构建高性能的消息消费系统。

学习目标

  1. 理解 RabbitMQ 各种消费者模式的特点与适用场景
  2. 掌握预取值(prefetch)的配置与调优策略
  3. 掌握多线程并发消费的实现方式与注意事项
  4. 能够设计高吞吐、低延迟的消息消费方案

学习建议

建议结合实际压测数据理解预取值和并发数对消费性能的影响。

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

📝 配套习题(20 题)

1
单选题

关于 RabbitMQ 消费者预取数量(prefetch count),以下说法正确的是:

A. basicQos(10) 表示消费者每次最多同时处理 10 条消息,未确认消息达到 10 条时不再投递新消息 B. basicQos(10) 表示消费者每秒最多消费 10 条消息 C. basicQos(10) 表示队列中最多保留 10 条未消费的消息 D. basicQos(10) 表示消费者每次 basicGet 批量拉取 10 条消息

2
多选题

关于预取数量(prefetch count)对系统性能的影响,以下说法正确的有哪些?

A. prefetch count 设置为 1 可以确保消息在消费者之间最均匀地分配 B. prefetch count 设置过大可能导致某些消费者积压大量未处理消息,而其他消费者空闲 C. prefetch count 越大,消费者的消息吞吐能力越高,但单条消息的处理延迟可能增加 D. prefetch count 对自动确认(autoAck=true)模式的消费者不生效

3
填空题

Java 客户端中 channel.basicQos(______, 10, ______) 表示设置全局预取数量为 10,第三个参数的含义是是否将 QoS 设置应用到整个 _____________ 而非单个消费者。

4
判断题

basicQos 设置后,只对设置之后新创建的消费者生效,对已存在的消费者不生效。

A

B

5
多选题

在 Java 客户端实现并发消费者模型时,以下说法正确的有哪些?

A. 可以为每个消费者创建独立的线程,每个线程独占一个 Channel B. 单个 Channel 上不能并发调用 basicConsume 创建多个消费者 C. 使用线程池管理并发消费者可以避免线程创建开销 D. 多线程消费者之间共享同一个 Channel 是线程安全的

6
单选题

在 Spring AMQP 中,以下哪种配置能实现消息并发消费?

A. @RabbitListener(queues = "myQueue", concurrency = "5-10") B. @RabbitListener(queues = "myQueue", threads = 5) C. @RabbitListener(queues = "myQueue", prefetch = 10) D. @RabbitListener(queues = "myQueue", parallel = true)

7
判断题

启用并发消费者后,同一队列中的消息仍然能严格按照发送顺序被处理。

A

B

8
简答题

某系统需要实现订单消息的并发处理,请描述使用 RabbitMQ Java 客户端实现并发消费者模型的最佳实践架构。

9
单选题

关于手动确认(manual acknowledgment),以下哪种做法是最佳实践?

A. 在消息回调函数入口处立即调用 basicAck 确认消息 B. 在业务逻辑执行成功后(如数据库更新完成)调用 basicAck C. 在消费者启动时预先确认所有收到的消息 D. 在消费者关闭时批量确认所有未确认的消息

10
多选题

以下哪些情况可能导致消息在手动确认模式下被重复消费

A. 消费者处理完业务逻辑后还没来得及调用 basicAck 就崩溃了 B. 消费者处理业务时抛出异常但未捕获,导致连接断开 C. 消费者正确调用了 basicAck 但业务逻辑没有实现幂等性 D. 消费者设置了过大的 prefetch count

11
填空题

Java 客户端中 channel.basicAck(___________, ______) 用于确认消息,其中第一个参数表示消息的 ________ ,第二个参数 false 表示不启用 ________

12
判断题

在手动确认模式下,如果消费者在处理消息时开启了数据库事务,应该在数据库事务提交成功后再调用 basicAck 确认消息。

A

B

13
单选题

使用 basicAck(deliveryTag, true) 进行批量确认时,以下说法正确的是:

A. 会确认所有已投递但尚未确认的消息,无论其 deliveryTag 大小 B. 仅确认 deliveryTag 等于当前值的消息 C. 会确认所有 deliveryTag 小于等于当前值且尚未确认的消息 D. 批量确认会导致消息被重复投递

14
多选题

关于批量确认的性能优化效果,以下说法正确的有哪些?

A. 批量确认可以减少消费者与 RabbitMQ 之间的网络往返次数 B. 批量确认在高吞吐场景下比逐条确认有显著的性能优势 C. 使用批量确认后,如果某条消息处理失败会影响其他消息的确认状态 D. 批量确认要求消息按 deliveryTag 顺序处理才能发挥优势

15
填空题

在实际业务中,如果消费者按批次处理消息(每批 50 条),批量确认的实现模式通常为:在处理完一批消息后,调用 basicAck(____________________, true) 一次性确认本批所有消息。这种模式下需要确保每批消息的处理是 ________________________ ,否则部分消息处理失败但已被确认。

16
判断题

使用批量确认时,如果消费者在调用 basicAck(deliveryTag, true) 之前崩溃,所有未确认的消息(包括已成功处理但尚未确认的消息)都会重新入队等待再次消费。

A

B

17
多选题

消费者崩溃后需要实现自动恢复,以下哪些是必须包含的恢复步骤?

A. 自动重新建立到 RabbitMQ 的 Connection B. 在新 Connection 上重新创建 Channel C. 重新声明队列和交换机(确保拓扑结构存在) D. 重新调用 basicConsume 订阅队列

18
单选题

RabbitMQ Java 客户端的 ConnectionFactory 默认启用了 Connection 自动恢复功能,以下关于自动恢复的说法正确的是:

A. 默认自动恢复只恢复 Connection,不恢复 Channel 和消费者订阅 B. 默认自动恢复会恢复 Connection、Channel 和消费者订阅,但不会恢复自定义的拓扑结构 C. 默认自动恢复会恢复 Connection、Channel、消费者订阅和所有拓扑结构(队列/交换机/绑定) D. RabbitMQ Java 客户端不支持自动恢复,必须手动实现

19
填空题

在 Java 客户端中,可以通过 connection.addShutdownListener(________________)channel.addShutdownListener(________________) 注册关闭监听器来感知连接或通道的异常关闭,并在监听器回调中执行自定义的 _________________

20
多选题

在实现消费者异常恢复时,以下哪些做法有助于提高系统的可靠性?

A. 设置重连退避策略(如指数退避),避免频繁重连对 Broker 造成压力 B. 在恢复后检查队列积压情况,必要时暂停消费等待积压消化 C. 记录每次连接断开的日志,便于问题排查 D. 使用心跳检测及时发现连接异常,减少消息处理中断时间

← 上一个专题 消息队列基础概念专题
下一个专题 → 源码分析与扩展专题

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

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

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

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