Apache Kafka 简介
Kafka 最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 Zookeeper 协调的分布式消息系统,用 Scala 语言编写。
Kafka 目前主要作为一个分布式的发布订阅式的消息系统使用,具备可扩展、可持久化、可靠性、高吞吐、低延迟的能力,支持高并发场景。
Kafka 中的角色
主要分为三种角色:Producer(消息生产者)、Consumer(消息消费者)、Kafka cluster(Kafka 集群,消息队列)
Kafka 0.9Kafka 0.10.x 及之后的版本增加了两个角色:Connectors 主要负责 Kafka 与其他系统的集成;Stream processer 提供了轻量级流式数据处理能力(流计算类库)
Kafka 0.10Kafka 中的概念
- broker:kafka 集群的服务器,负责消息存储
- topic:用来对消息进行分类,每一条消息都属于一个 topic
- partition:每一个 topic 被分成多个 partition 存储,每一条消息只会存储到一个 partition 中,partition 可以提高提高消息的并行处理能力
- offset:每一条消息发送到 topic 中都会有一个特定的 offset(依次递增),消费者是根据 offset 来顺序消费数据
- group id:每个 Consumer 具有一个 group id 用于标记其消费者组
- consumer group:具有相同 group id 的 Consumer,共同消费某个(或某些)topic
Topic & Partition
Topic 在逻辑上可以被认为是一个 queue,每一条消息都必须指定 topic,既把这条消息放进哪个 queue。每个 topic 可以被分成多个 partition,每个 partition 对应一个 append log 文件,负责存储发送到这个 partition 的消息(尾部追加)。
每条消息在文件中的位置称为 offset,作为一条消息的唯一标记(Long 型数字)。
imagepartition 存储是顺序写磁盘,效率非常高,这也是 Kafka 高吞吐率的一个很重要的保证。
partition 是为了提高 topic 中消息的并行处理能力,使用合适的规则(根据消息的 key 和 partition 机制),可以使一个 topic 中的消息均匀分布到各个 partition 中。如果只有一个 partition,既只有一份存储文件,那么其所在的服务器的机器IO会成为性能瓶颈,通过增加 partition 可以进行水平扩展。
Consumer & Consumer group
consumer 消费数据根据 offset 依次消费,最后一个消费的消费记录 offset 会保存在 broker 中,再次进行消费时可以从当前消费位置开始继续消费同一个 topic。
对于多个独立的 consumer 消费同一个 topic,不同的 consumer 之间互不影响,都能消费到 topic 下的全部消息。每个 consumer 会各自维护当前 offset。
image每个 consumer 都属于一个 consumer group,具有相同 group id 的 consumer 属于同一个 consumer group。
同一 topic 的一条消息可以被多个 consumer group 同时消费。但是在一个 consumer group 内,只有一个 consumer 能够消费这条消息。在 Kafka 的实现中,consumer group 中的多个 consumer 会进行负载均衡,并且每个 partition 只能被一个 consumer 消费到,因此同一个 consumer group 中 consumer 的数量不要超过 partition 的数量。
image同一个消费者/消费者组可以通过重置 offset 多次消费某些数据,或者跳过消费某些数据。
Kafka 的特点
- 高吞吐量(顺序读写)
- 高可靠性(数据备份)
- 可持久化(本次磁盘持久化)
- 可扩展性(集群热扩(缩)容)
- 分区内有序
- 生产者与消费者多样性(支持多语言)
Kafka 适用场景
-
消息系统(Messaging)
-
网站活性跟踪(Web tracking)
-
日志收集(Log Collection)