Apache Kafka 是一个开源的分布式流处理平台,最初由 LinkedIn 开发并于2011年开源。它是一个高吞吐量、低延迟的消息系统,支持实时数据处理和大规模消息传递,并且在大数据生态系统中被广泛用于构建实时数据管道和流应用。
Kafka 架构:
-
Broker(代理服务器):
- Kafka 服务的核心是 Broker,它是运行 Kafka 服务的进程,多个 Broker 可以组成一个集群,每个 Broker 都可以保存一部分消息数据。
- Broker 接受生产者发送的消息,并将这些消息持久化存储到磁盘上的日志文件中;同时,它也响应消费者对消息的读取请求。
-
Topic(主题):
- Kafka 中的消息按照 Topic 进行分类,每个 Topic 可以被划分为多个 Partition(分区),每个 Partition 在物理上对应一个有序的日志文件。
- 分区的存在使得 Kafka 能够水平扩展并实现高效的并发写入和读取操作。
-
Producer(生产者):
- 生产者负责发布消息到指定的 Topic。它们可以选择将消息发送到某个 Topic 的具体 Partition,或者让 Kafka 自动决定。
-
Consumer(消费者):
- 消费者订阅 Topic 并从 Broker 中读取消息。消费者可以独立地消费来自 Topic 中不同 Partition 的消息,且可以根据 Group ID 归属于不同的消费组,从而实现消息的负载均衡和多实例间的容错性。
-
ZooKeeper(协调服务):
- 虽然 Kafka 0.9版本以后逐渐减少了对 ZooKeeper 的依赖,但在较早版本中,ZooKeeper 用于管理集群元数据、Broker 注册表、消费者的消费状态以及 Consumer Group 管理等。
Kafka 工作流程:
-
消息生产:
- 生产者将消息序列化后,选择或由 Kafka 分配一个 Partition,然后将其推送到对应的 Broker 上。
- Broker 将接收到的消息添加到该 Partition 的末尾,并记录下消息的偏移量(offset)作为唯一标识。
-
消息存储:
- Kafka 使用磁盘进行消息存储,Partition 日志中的消息会定期进行压缩,提高存储效率。
- 每个 Partition 的消息都是有序且不可变的,新消息总是追加到 Partition 的末端。
-
消息消费:
- 消费者通过拉取模式从 Broker 获取消息,而非 Broker 主动推送。
- 消费者根据自己的消费速度和需求,从各个 Partition 中指定的偏移量开始读取消息。
- 消费者可以通过提交 offset 到 Kafka 或 ZooKeeper 来跟踪自己已消费的位置。
-
消费组与分发策略:
- 多个消费者可以形成一个消费组,同一消费组内的消费者共同消费一个 Topic 的所有 Partition,但每个 Partition 的消息只会分配给该组内一个消费者,这样实现了消息的负载均衡。
- 不同消费组之间则可以各自独立消费 Topic 的全部消息,实现发布/订阅模型。
总的来说,Kafka 提供了一个可伸缩、持久化且容错性强的消息队列解决方案,适用于海量实时数据的传输与处理场景。