捋一捋Kafka中的消费者API

       之前学习kafka的时候,知道kafka有新的consumer和旧的consumer,还有高阶consumer API,低阶consumer API,搞得一头雾水,不知道他们之间的关系。今天在这儿捋一捋他们的关系。

       Kafka在0.8.2.x版本中用java语言重写了producer,在0.9.0.x版本中用java重写了consumer,旧的都是scala语言编写的。今天在这儿只说说consumer吧。

       Kafka的高阶消费者(high-level consumer)和低阶消费者(low-level consumer,底层用SimpleConsumer实现)是旧版本的consumer中的。新版本的consumer中没有这两个概念。新版本把高阶消费者和低阶消费者整合到一起了,分别对应KafkaConsumer类的subscribe和assign方法。新旧版本的consumer差别还是很多的,一言难尽。

下面来总结一下新旧消费者的主要区别:

属性 新版本 旧版本
编程语言 Java Scala
客户端(Kafka消费者、生产者相对于服务端broker来说都是客户端)所在包 org.apache.kafka.clients.* kafka.consumer.*
消费者是否依赖ZooKeeper
消费者组的消费进度offset保存位置 内部的topic __consumer_offsets中(有compact机制,只会保存最新的消费进度,不用担心消费记录占用空间) ZooKeeper(当消费频繁时需要频繁写zk,zk不适合用作频繁写的场景)
消费者组管理 由某个broker担任消费组的协调者coordinator,使得消费组成员变化不用依靠zk来管理,进一步解耦zk 依赖zk管理

旧版本的消费者:

属性 高阶API 低阶API
是否有消费者组 有(多个消费者组成一个组,彼此之间有关联) 无(单独的消费者,与其他消费者没有关系)
优缺点 死板省事 灵活麻烦
使用范围 一般的开发场景 需要灵活性的第三方框架,比如Apache-storm的Kafka插件storm-kafka。
需要反复消费历史数据的场景。
只想消费部分分区的数据。
需要精确实现处理一次(exactly-once,可以通过把位移提交和数据处理放入一个事务中实现)。
消费的offset选择 只能从上次消费的地方接着消费(除非自己去重置消费位移) 可以从分区任意位置(前提是kafka消息日志还没有被删除)消费
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章