全部学科
Python全栈
python
NodeJS全栈
nodejs

消费者模式与并发专题测试

20 题 45 分钟 难度:★★

考察知识点

  • 消费者模式与并发相关概念
  • RabbitMQ 进阶实践
💡 参考答案在文末
判断题
1

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

A

B

2

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

A

B

3

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

A

B

4

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

A

B

单选题
5

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

6

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

A

在消息回调函数入口处立即调用 basicAck 确认消息

B

在业务逻辑执行成功后(如数据库更新完成)调用 basicAck

C

在消费者启动时预先确认所有收到的消息

D

在消费者关闭时批量确认所有未确认的消息

7

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

A

默认自动恢复只恢复 Connection,不恢复 Channel 和消费者订阅

B

默认自动恢复会恢复 Connection、Channel 和消费者订阅,但不会恢复自定义的拓扑结构

C

默认自动恢复会恢复 Connection、Channel、消费者订阅和所有拓扑结构(队列/交换机/绑定)

D

RabbitMQ Java 客户端不支持自动恢复,必须手动实现

8

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

A

basicQos(10) 表示消费者每次最多同时处理 10 条消息,未确认消息达到 10 条时不再投递新消息

B

basicQos(10) 表示消费者每秒最多消费 10 条消息

C

basicQos(10) 表示队列中最多保留 10 条未消费的消息

D

basicQos(10) 表示消费者每次 basicGet 批量拉取 10 条消息

9

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

A

会确认所有已投递但尚未确认的消息,无论其 deliveryTag 大小

B

仅确认 deliveryTag 等于当前值的消息

C

会确认所有 deliveryTag 小于等于当前值且尚未确认的消息

D

批量确认会导致消息被重复投递

多选题
10

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

A

prefetch count 设置为 1 可以确保消息在消费者之间最均匀地分配

B

prefetch count 设置过大可能导致某些消费者积压大量未处理消息,而其他消费者空闲

C

prefetch count 越大,消费者的消息吞吐能力越高,但单条消息的处理延迟可能增加

D

prefetch count 对自动确认(autoAck=true)模式的消费者不生效

11

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

A

可以为每个消费者创建独立的线程,每个线程独占一个 Channel

B

单个 Channel 上不能并发调用 basicConsume 创建多个消费者

C

使用线程池管理并发消费者可以避免线程创建开销

D

多线程消费者之间共享同一个 Channel 是线程安全的

12

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

A

设置重连退避策略(如指数退避),避免频繁重连对 Broker 造成压力

B

在恢复后检查队列积压情况,必要时暂停消费等待积压消化

C

记录每次连接断开的日志,便于问题排查

D

使用心跳检测及时发现连接异常,减少消息处理中断时间

13

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

A

消费者处理完业务逻辑后还没来得及调用 basicAck 就崩溃了

B

消费者处理业务时抛出异常但未捕获,导致连接断开

C

消费者正确调用了 basicAck 但业务逻辑没有实现幂等性

D

消费者设置了过大的 prefetch count

14

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

A

批量确认可以减少消费者与 RabbitMQ 之间的网络往返次数

B

批量确认在高吞吐场景下比逐条确认有显著的性能优势

C

使用批量确认后,如果某条消息处理失败会影响其他消息的确认状态

D

批量确认要求消息按 deliveryTag 顺序处理才能发挥优势

15

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

A

自动重新建立到 RabbitMQ 的 Connection

B

在新 Connection 上重新创建 Channel

C

重新声明队列和交换机(确保拓扑结构存在)

D

重新调用 basicConsume 订阅队列

填空题
16

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

17

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

18

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

19

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

简答题
20

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

参考答案
1.错误 2.正确 3.正确 4.错误 5.A 6.B 7.C 8.A 9.C 10.A;B;C;D 11.A;C 12.A;B;C;D 13.A;B;C 14.A;B;D 15.A;B;C;D 16.0;false;通道(channel) 17.本批最大 deliveryTag;原子的/要么全部成功要么全部失败 18.deliveryTag;false;投递标签## 解析 `basicAck` 方法的参数说明: 1. **deliveryTag**:消息的投递标签(唯一标识符),由 RabbitMQ 在投递消息时自动分配。消费者通过 deliveryTag 标识要确认的具体消息。 2. **multiple**:是否批量确认。 - `false`:仅确认 deliveryTag 对应的单条消息。 - `true`:确认所有 deliveryTag 小于等于当前值且未确认的消息(批量确认)。 典型用法: ```java // 确认单条消息 channel.basicAck(deliveryTag, false); // 批量确认(确认所有未确认的、deliveryTag <= 当前值的消息) channel.basicAck(deliveryTag, true); ``` 注意:deliveryTag 是 Channel 级别的递增整数,不同 Channel 的 deliveryTag 独立。 19.shutdownListener;shutdownListener;恢复逻辑/重连逻辑 20.
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一套试卷 消息队列基础概念专题测试
下一套试卷 → 源码分析与扩展专题测试
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码