prefetch count 通过 basic.qos 设置,限制每个消费者未确认消息上限;设为0或不设则不限制,必须配合 manual ack 才生效,验证需观察管理界面中 unack 数是否≈消费者数×prefetch。

在 RabbitMQ 中,消费者最大预取数量(prefetch count)是通过 basic.qos 方法设置的,它限制每个消费者在未确认(unacknowledged)状态下最多能持有多少条消息。这个值不设或设为 0,表示不限制;设为正整数(如 1、10、50),才真正启用流控和公平分发。
Java 原生客户端配置方式
在创建 Channel 后、调用 basicConsume 前,显式调用 basicQos:
-
channel.basicQos(1);—— 每个消费者最多预取 1 条未确认消息 -
channel.basicQos(10);—— 最多预取 10 条 - 注意:该设置作用于当前 Channel 上的所有新消费者(
global=false是默认行为)
Spring Boot 中的配置方式
推荐在 application.yml 或 application.properties 中统一配置,无需写 Java 代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Direct 类型监听器(默认):
spring.rabbitmq.listener.direct.prefetch=1 - Simple 类型监听器:
spring.rabbitmq.listener.simple.prefetch=1 - 必须配套关闭自动签收:
spring.rabbitmq.listener.simple.acknowledge-mode=manual
关键前提:手动 ACK 必须开启
prefetch 只在手动确认模式下生效。如果 autoAck=true,RabbitMQ 一推送就认为成功,prefetch 完全失效:
- Java 原生:
channel.basicConsume(queue, false, ...)第二个参数必须为false - Spring Boot:确保
acknowledge-mode设为manual,并在业务逻辑完成后调用channel.basicAck()
怎么验证配置是否生效
别只看配置文件写了没,要实时观察 RabbitMQ 管理界面(http://localhost:15672):
- 进入对应队列详情页,查看 Messages unacknowledged 数值 —— 它应大致等于
活跃消费者数 × prefetch - 查看 Consumers 列表,确认实际连接数与你配置的
concurrency一致 - 若 unack 远高于预期,说明某消费者卡住或没正确 ack;若始终只有 1 个 consumer,可能是线程池没启起来或监听器未注册










