考察知识点
- 消费者模式与并发相关概念
- RabbitMQ 进阶实践
💡 参考答案在文末
判断题
1
启用并发消费者后,同一队列中的消息仍然能严格按照发送顺序被处理。
2
使用批量确认时,如果消费者在调用 basicAck(deliveryTag, true) 之前崩溃,所有未确认的消息(包括已成功处理但尚未确认的消息)都会重新入队等待再次消费。
3
在手动确认模式下,如果消费者在处理消息时开启了数据库事务,应该在数据库事务提交成功后再调用 basicAck 确认消息。
4
basicQos 设置后,只对设置之后新创建的消费者生效,对已存在的消费者不生效。
单选题
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
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 小于等于当前值且尚未确认的消息
多选题
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 创建多个消费者
D
多线程消费者之间共享同一个 Channel 是线程安全的
12
在实现消费者异常恢复时,以下哪些做法有助于提高系统的可靠性?
A
设置重连退避策略(如指数退避),避免频繁重连对 Broker 造成压力
B
在恢复后检查队列积压情况,必要时暂停消费等待积压消化
D
使用心跳检测及时发现连接异常,减少消息处理中断时间
13
以下哪些情况可能导致消息在手动确认模式下被重复消费?
A
消费者处理完业务逻辑后还没来得及调用 basicAck 就崩溃了
B
消费者处理业务时抛出异常但未捕获,导致连接断开
C
消费者正确调用了 basicAck 但业务逻辑没有实现幂等性
D
消费者设置了过大的 prefetch count
14
关于批量确认的性能优化效果,以下说法正确的有哪些?
A
批量确认可以减少消费者与 RabbitMQ 之间的网络往返次数
B
批量确认在高吞吐场景下比逐条确认有显著的性能优势
C
使用批量确认后,如果某条消息处理失败会影响其他消息的确认状态
D
批量确认要求消息按 deliveryTag 顺序处理才能发挥优势
15
消费者崩溃后需要实现自动恢复,以下哪些是必须包含的恢复步骤?
A
自动重新建立到 RabbitMQ 的 Connection
B
在新 Connection 上重新创建 Channel
填空题
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.略
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码