Kafka 入门介绍

Kafka 最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 Zookeeper 协调的分布式消息系统,用 Scala 语言编写。

Kafka 目前主要作为一个分布式的发布订阅式的消息系统使用,具备可扩展、可持久化、可靠性、高吞吐、低延迟的能力,支持高并发场景。

Kafka 中的角色

主要分为三种角色:Producer(消息生产者)、Consumer(消息消费者)、Kafka cluster(Kafka 集群,消息队列)

Kafka 0.9

Kafka 0.10.x 及之后的版本增加了两个角色:Connectors 主要负责 Kafka 与其他系统的集成;Stream processer 提供了轻量级流式数据处理能力(流计算类库)

Kafka 0.10

Kafka 中的概念

  • 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 型数字)。

partition 存储是顺序写磁盘,效率非常高,这也是 Kafka 高吞吐率的一个很重要的保证。

partition 是为了提高 topic 中消息的并行处理能力,使用合适的规则(根据消息的 key 和 partition 机制),可以使一个 topic 中的消息均匀分布到各个 partition 中。如果只有一个 partition,既只有一份存储文件,那么其所在的服务器的机器IO会成为性能瓶颈,通过增加 partition 可以进行水平扩展。

Consumer & Consumer group

consumer 消费数据根据 offset 依次消费,最后一个消费的消费记录 offset 会保存在 broker 中,再次进行消费时可以从当前消费位置开始继续消费同一个 topic。

对于多个独立的 consumer 消费同一个 topic,不同的 consumer 之间互不影响,都能消费到 topic 下的全部消息。每个 consumer 会各自维护当前 offset。

每个 consumer 都属于一个 consumer group,具有相同 group id 的 consumer 属于同一个 consumer group。

同一 topic 的一条消息可以被多个 consumer group 同时消费。但是在一个 consumer group 内,只有一个 consumer 能够消费这条消息。在 Kafka 的实现中,consumer group 中的多个 consumer 会进行负载均衡,并且每个 partition 只能被一个 consumer 消费到,因此同一个 consumer group 中 consumer 的数量不要超过 partition 的数量。

同一个消费者/消费者组可以通过重置 offset 多次消费某些数据,或者跳过消费某些数据。

Kafka 的特点

  • 高吞吐量(顺序读写)
  • 高可靠性(数据备份)
  • 可持久化(本次磁盘持久化)
  • 可扩展性(集群热扩(缩)容)
  • 分区内有序
  • 生产者与消费者多样性(支持多语言)

Kafka 适用场景

  1. 消息系统(Messaging)

  2. 网站活性跟踪(Web tracking)

  3. 日志收集(Log Collection)


Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

15 − 12 =