Kafka consumer版本升级(0.8.2->1.1.1)

1、背景

consumer是读取Kafka集群中某些topic消息的应用程序。当前Kafka生态中,consumer可以由多种语言实现,这里主要讨论使用Java语言开发的consumer程序。除了consumer的定义之外,还要明确consumer的版本和分类。

Kafka最初版本自带由Scala语言编写的consumer客户端,称之为Scala consumer或者old consumer,即旧版本consumer。随着时间的推移,Kafka社区日益发现该版本的consumer存在着诸多的缺陷,因此在社区的0.9.0.0版本正式推出了新版本的consumer客户端。由于它是用Java编写的,因此称之为Java consumer或者new consumer,即新版本的consumer。

这两个版本在设计上差异很大,特别是新版本consumer颠覆了旧版本consumer管理和保存位移(offset)的机制。

2、新旧版本差异

consumer配置项部分差异

  • auto.offset.reset
    在新版本中依旧为auto.offset.reset,只是取值范围变为earliest、latest和none
  • zookeeper.connect
    新版本中consumer不再依赖zookeeper,改为依赖broker,此参数替换为bootstrap.servers
  • zookeeper.session.timeout.ms
    因为不依赖zookeeper,此参数取消
  • zookeeper.sync.time.ms
    因为不依赖zookeeper,此参数取消
  • auto.commit.enable
    新版本中此参数改为enable.auto.commit,控制consumer的offset是否自动定时提交给broker
  • auto.commit.interval.ms
    新版本中依旧是auto.commit.interval.ms,在enable.auto.commit为true的情况下,用来指定consumer向broker提交offset的时间间隔

消息的消费

  • 旧版本消息的消费
    旧版本consumer有consumer group和独立consumer的概念,他们有特定的名字:high-level consumer和low-level consumer,前者使用的是consumer group,而后者没有group的概念。这里只介绍high-level consumer。
    和新版本consumer中使用的consumer group原理类似,high-level consumer要求用户为多个consumer实例指定相同的groupId,使其构成一个consumer group共同参与消费。不同的是旧版本依赖zookeeper完成这些功能。旧版本consumer使用多线程的方式来消费订阅的topic。例如,假如某个consumer group订阅了一个topic,该topic有10个分区(partition),用户在消费时指定使用10个线程来消费该topic,那么每个线程都会被分配一个分区,若用户指定了11个线程,则有一个线程不会分配到任何分区,造成资源浪费。这里可以参考《Apache Kafka 实战》中5.10节旧版本consumer的代码。
  • 新版本消息的消费
    新版本consumer使用的是单线程轮询的方式来消费消息,且这里的KafkaConsumer是非线程安全的,单线程的消费方式可以参考《Apache Kafka 实战》5.2构建consumer的代码,多线程的消费方式可以参考《Apache Kafka 实战》5.8多线程消费实例的代码。

遇到的问题

  • 单机情况下在poll中卡住
    请参考:https://stackoverflow.com/questions/37770024/kafka-0-9-0-1-java-consumer-stuck-in-awaitmetadataupdate
  • 生产环境下遇到poll卡住的问题
    请查看是否需要配置consumer的用户名和密码,以及security.protocol和sasl.mechanism

参考:

发布了16 篇原创文章 · 获赞 0 · 访问量 811

猜你喜欢

转载自blog.csdn.net/shengruxiahua2571/article/details/102489345
今日推荐