Kafka的消费者高阶和低阶API有何区别
Kafka的消费者高阶和低阶API有何区别
[TOC]
Kafka提供了两套consumer API:The high-level Consumer API 和 The SimpleConsumer API,其中 high-level consumer API 提供了一个从Kafka消费数据的高层抽象,而 SimpleConsumer API 则需要开发人员更多的关注细节。
The high-level consumer API
high-level consumer API 提供了 consumer group
的语义,一个消息只能被 group 内的一个 consumer 所消费,且 consumer 消费消息时不关注 offset ,最后一个 offset 由 zookeepe
r 保存。
使用 high-level consumer API可以是多线程的应用,应当注意:
- 如果消费线程数大于 partition 的数量,则有些线程将收不到消息
- 如果 partition 的数量大于线程数,则有些线程将多收到其他多个partition的消息
- 如果一个线程消费多个 partition , 则无法保证你收到消息的顺序,而一个 partition 内的消是有序的
优点
- 高级API写起来简单
- 不需要去自行去管理offset,系统通过zookeeper自行管理
- 不需要管理分区,副本等情况,系统自动管理
- 消费者断线会自动根据上一次记录在 zookeeper中的offset去接着获取数据(默认设置5s更新一下 zookeeper 中存的的offset),版本为0.10.2
- 可以使用group来区分对访问同一个topic的不同程序访问分离开来(不同的group记录不同的offset,这样不同程序读取同一个topic才不会因为offset互相影响)
缺点
- 不能自行控制 offset(对于某些特殊需求来说)
- 不能细化控制如分区、副本、zk 等
The SimpleConsumer API
如果你想要对 partition 有更多的控制权,那就应该使用 SimpleConsumer API ,比如:
多次读取一个消息
只消费一个 partition 中的部分消息
使用事务来保证一个消息仅被消费一次
但是使用此 API 是, partition、offset、broker、leader 等对你不再透明,需要自己管理,因此,你需要做大量的额外的工作:
必须在应用程序中跟踪 offset ,从而确定下一条应该消费哪条数据
应用程序需要通过程序获知每个 partition 的 leader 是谁
需要处理 leader 的变更
优点
- 能够开发者自己控制offset,想从哪里读取就从哪里读取。
- 自行控制连接分区,对分区自定义进行负载均衡
- 对 zookeeper 的依赖性降低(如:offset 不一定非要靠 zk 存储,自行存储offset 即可,比如存在文件或者内存中)
缺点
- 太过复杂,需要自行控制 offset,连接哪个分区,找到分区 leader 等
实现
实现使用 SimpleConsumer API 读取指定 topic ,指定 partition ,指定 offset 的数据。
主要步骤
- 根据指定的分区从主题元数据中找到主副本
- 获取分区最新的消费进度
- 从主副本拉取分区的消息
- 识别主副本的变化,重试
方法描述
- **findLeader()**: 客户端向种子节点发送主题元数据,将副本集加入备用节点
- **getLastOffset()**: 消费者客户端发送偏移量请求,获取分区最近的偏移量
- run() :消费者低级AP I拉取消息的主要方法
- findNewLeader() :当分区的主副本节点发生故障,客户将要找出新的主副本
相关链接:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!