虽然目前Kafka0.10版本已经重写了其API,但底层原理是类似的,所以我们可以先了解kafka0.8.x里面的提供的Consumer的实现原理与交互流程
Kafka提供了两套API给Consumer
- The SimpleConsumer API
- The high-level Consumer API
1. 低阶API
本质上是提供了一种与broker交互信息的API
剩下的处理全靠用户自己的程序,功能比较简单,但用户扩展性比较强
1) API结构
低阶API的consumer,指定查找topic某个partition的指定offset去消费
首先与broker通信,寻找到leader(不与zookeeper通信,不存在groupid),然后直接和leader通信,指定offset去消费。消费多少,从哪里开始消费,都可控(我们的例子是从0开始消费)
findLeader方法中会去调用findPartitionMetadata方法
程序运行结果:
运行过程中一直卡住没有成功消费,加入如下错误信息判断,发现error code为1
说明我们从offset 0消费offsetoutofrange了
(我们发送请求topic1 partition0的offset 0 broker回复我们offset out of range,因为kafka中已经没有offset 0 的数据了,已经过期清理掉了)
所以我们添加getLastOffset,getEarliestOffset的方法,获取该topic该partition在kafka集群中有的的最小和最大的offset
调整offset之后,可能最新的数据也过期了,于是获取到的message的size为0
查看SimpleConsumer的源码: