-
如果客户端与待拉取消息的broker节点有待发送的网络请求(见代码@4),则本次拉取任务将不会再发起新的拉取请求,待已有的请求处理完毕后才会拉取新的消息。
-
拉取消息时需要指定拉取消息偏移量,来自队列负载算法时指定,主要消费组的最新消费位点。
Step2:按Node依次构建请求节点,并通过client的send方法将请求异步发送,当收到请求结果后会调用对应的事件监听器,这里主要的是一次拉取最大的字节数50M。
值得注意的是在Kafka中调用client的send方法并不会真正触发网络请求,而是将请求放到发送缓冲区中,Client的poll方法才会真正触发底层网络请求。
Step3:当客户端收到服务端请求后会将原始结果放入到completedFetches中,等待客户端从中解析。
本篇文章暂时不关注服务端对fetch请求的处理,等到详细剖析了Kafka的存储相关细节后再回过来看Fetch请求的响应。
1.2 Fetcher的fetchedRecords方法详解
向服务端发送拉取请求异步返回后会将结果返回到一个completedFetches中,也可以理解为接收缓存区,接下来将从缓存区中将结果解析并返回给消费者消费。从接