Skip to content

消费者

消费者(Consumer)通过 Fetch API 从 topic 分区按 offset 读取消息。RobustMQ 兼容标准 Kafka 消费者:两种订阅方式、位点重置策略、长轮询拉取、以及 key/value/header 的完整往返。消费组相关的协调流程见消费组

两种订阅方式

方式API 语义说明
assign(partitions)手动指定分区客户端自己决定读哪些分区,不加入消费组,无再均衡
subscribe(topics)加入消费组由协调器分配分区,支持再均衡(见消费组)

起始位点:auto.offset.reset

当消费者对某分区没有已提交位点(首次消费,或位点已过期)时,auto.offset.reset 决定从哪里开始:

取值起点
earliest从最早可用 offset 开始
latest从最新 offset 开始(只读之后新写入的消息)

若已有已提交位点,则从该位点继续,auto.offset.reset 不生效。位点的提交与管理见位点管理

Fetch 流程

RobustMQ Kafka 消费流程

一次 Fetch 请求的处理:

  1. 解码:协议层解出请求;Fetch v12+ 用 topic_id(UUID)标识 topic,Broker 反解为 topic 并在响应中回填 topic_id。
  2. 按 offset 读取:存储层用 offset→position 索引定位,读取解码后的 record。
  3. 长轮询:若可读数据不足,Broker 等待(见下节)。
  4. 重组 RecordBatch:把解码 record 重新组装成 Kafka RecordBatch 返回。

长轮询(long poll)

Fetch 请求带两个控制参数:

参数含义
min_bytes期望至少返回的字节数
max_wait最长等待时间

RobustMQ 的长轮询是一次"等待后重读":若首次读取的数据量不满足 min_bytes,则最多等待 max_wait 后再读一次,然后返回。这样在无新消息时避免空转,又能在 max_wait 内尽快响应新到达的数据。

消息往返

消费者读到的每条 record 保留完整字段:

字段说明
key原样返回
value原样返回
headers原样返回
offset存储层分配的连续 offset

压缩:无论生产侧用何种压缩,Fetch 目前固定返回未压缩批次(见生产者 · 压缩)。

相关文档

🎉 既然都登录了 GitHub,不如顺手给我们点个 Star 吧!⭐ 你的支持是我们最大的动力 🚀