Kafka 是由 LinkIn 开源的实时数据处理框架,目前已经更新到 2.3 版本。不同于一般的消息中间件,Kafka 通过数据持久化和磁盘读写获得了极高的吞吐量,并可以不依赖 Storm,SparkStreaming 的流处理平台,自己进行实时的流处理。
Kakfa 的 Offset 机制是其最核心机制之一,由于 API 对于部分功能的实现,我们有时并没有手动去设置 Offset,那么 Kafka 到底有几个 Offset 呢?
一、生产者 Offset
首先,我们先来看生产者的 offset,我们知道 Kafka 是通过生产者将消息发送给某一个 topic,消费者再消费这个 topic 的消息,当然可能有多个生产者,多个消费者,还可能有消费者组的概念,这个稍后在讨论。
当生产者将消息发送给某一个 topic 时,要看有多少个分区,因为 kafka 是通过分区机制实现分布式的。
图 生产者 offset
通过此图可以清晰的看到生产者的 offset 原理,不管是多少个生产者,还是我们规定了他们会写入哪一个分区,但只要他们写入的时候,一定是每一个分区都有一个 offset,这个 offset 就是生产者的 offset,同时也是这个分区的最新最大的 offset。
有些时候我们在开发生产者代码时并没有指定某一个分区的 offset,可能是我们使用的单分区,或者默认均匀的写入多个分区,这个工作 kafka 帮我们完成了。
二、消费者 Offset
再来看消费者端 offset,要稍微复杂一些。
图 消费者 offset
这是某一个分区的 offset 情况,我们已经知道生产者写入的 offset 是最新最大的值也就是 12,而当 Consumer A 进行消费时,他从 0 开始消费,一直消费到了 9,他的 offset 就记录在了 9,Consumer B 就纪录在了 11。等下一次他们再来消费时,他们可以选择接着上一次的位置消费,当然也可以选择从头消费,或者跳到最近的记录并从“现在”开始消费。
这样即使有多个分区,消费者也能灵活使用。
图 消费者组
消费者组的概念其实并不影响对 offset 的理解,上面的情况 Consumer A,Consumer B 如果是同组就不能同时消费一个分区的消息,不同组的消费者可以同时消费一个分区的消息。
还有一种 offset 的说法,就是 consumer 消费未提交时,本地是有另外一个 offset 的,这个 offset 不一定与集群中记录的 offset 一致。
所以,kafka 每一个 topic 分区和生产者,消费者不同,是有多个 offset 的。
总结如下:
offset 是指某一个 分区 的偏移量。
topic partition offset 这三个唯一确定一条消息。
生产者的 offset 其实就是最新的 offset。
消费者的 offset 是他自己维护的,他可以选择分区最开始,最新,也可以记住他消费到哪了。
消费者组是为了不同组的消费者可以同时消费一个分区的消息。
更多 Kafka 相关技术文章:
什么是 Kafka?
Kafka 监控工具汇总
Kafka 快速入门
Kafka 核心之 Consumer
Kafka 核心之 Producer
更多实时计算,Flink,Kafka 等相关技术博文,欢迎关注实时流式计算