版本2.4.0
Kafka的客户端消费者在启动的过程中会通过ensureActiveGroup()方法来确保自己是可用的消费者,在这个方法中,会向kafka的broker集群发送join请求,在join请求的response中可以得到该生产者所订阅的topic中被分配得到的分区信息。而接下来的消息拉取将会只请求此处分配得到的topic分区。此时,当前获得的topic分区的消费偏移量还是未知的,在正式拉取消息之前需要构造fetchOffset请求得到具体的偏移量位置以便消费。
private RequestFuture> sendOffsetFetchRequest(Setpartitions) {
Node coordinator = checkAndGetCoordinator();
if (coordinator == null)
return RequestFuture.coordinatorNotAvailable();
log.debug("Fetching committed offsets for partitions: {}", partitions);
// construct the request
OffsetFetchRequest.Builder requestBuilder = new OffsetFetchRequest.Builder(this.groupId,
new ArrayList<>(partitions));
// send the request with a callback
return client.send(coordinator, requestBuilder)
.compose(new OffsetFetchResponseHandler());
}
每次当kafka的消费者需要通过poll()方法拉取消息的时候,将会通过sendFetches()方法来试图拉取消息。
在准备发送fetch请求拉取消息的时候,首先需要通过prepareFetchRequests()方法来准备fetch请求。
已经完成拉取而没有实际处理的topic分区暂时没有必要再次拉取消息,而过滤掉以上情况的broker分配给该消费者的topic分区,将会用来做发送fetch请求的准备。
private ListfetchablePartitions() {
Setexclude = new HashSet<>();
if (nextInLineRecords != null && !nextInLineRecord