- 在拉取消息前需要确保
- 客户端已经连接上协调者
- 消费者收到协调者分配给它的分区
- 消费者拉取消息的准备工作
- 连接协调者
- 向协调者发送请求加入消费组,从协调者获取分配的分区
一、消费者拉取消息前的顺序
- 消费者向协调者申请加入消费组
- 服务端存在管理消费者的协调者,协调者将消费者加入消费组
- 协调者为所有消费者分配分区
- 消费者从协调者获得分配给它的分区
- 消费者拉取分区的消息
二、发送请求并获取结果
- 每个消费者都要向协调者发送 JoinGroupRequest(加入消费组的请求),每个消费者从 JoinGroupResponse(加入消费组的响应)中获取分配的分区
- 流程伪代码如下,真实代码在 AbstractCoordinator 的 joinGroupIfNeeded 方法中
JoinGroupResponse joinResult = sendJoinGroupRequest();
Assignment assignment = partitionAssignment(joinResult);
subscriptions.assignFromSubscribed(assignment.partitions());

- 实际情况是要等待所有消费者都加入消费组后才能执行分配分区的算法,所以刚开始返回的是一个异步对象 Future
RequestFuture<JoinGroupResponse> future = sendJoinGroupRequest();
client.poll