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 由 zookeeper 保存。

​ 使用 high-level consumer API可以是多线程的应用,应当注意:

  1. 如果消费线程数大于 partition 的数量,则有些线程将收不到消息
  2. 如果 partition 的数量大于线程数,则有些线程将多收到其他多个partition的消息
  3. 如果一个线程消费多个 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 的数据。

主要步骤

  1. 根据指定的分区从主题元数据中找到主副本
  2. 获取分区最新的消费进度
  3. 从主副本拉取分区的消息
  4. 识别主副本的变化,重试

方法描述

  1. **findLeader()**: 客户端向种子节点发送主题元数据,将副本集加入备用节点
  2. **getLastOffset()**: 消费者客户端发送偏移量请求,获取分区最近的偏移量
  3. run() :消费者低级AP I拉取消息的主要方法
  4. findNewLeader() :当分区的主副本节点发生故障,客户将要找出新的主副本

相关链接:

Kafka之API操作

kafka consumer消费者API

kafka(消费者低级API)