之前学习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消息日志还没有被删除)消费 |