Apache Kafka 是一个高可扩展、分布式、基于发布订阅的消息系统。其主要原理是将所有的消息封装在一个 Record 中,然后以 Topic 为单位进行批量发送。Kafka 以可靠性、高吞吐量、性能强劲,支持在线扩展、持久化存储和高并发等主要特点在开发中受到广泛的关注和应用。
Kafka 平台架构
Apache Kafka 主要由 Producer(生产者)、Consumer(消费者)和 Broker(单一的 Kafka 实例)三个组成部分构成,其中 Broker 包含 Topic 和 Partition 两个部分。多个 Broker 形成一个 Kafka 集群,负责消息的存储和传递。Producer 生成消息并将数据发送到 Broker 上,Broker 将消息存储在 Topic 中,Consumer 订阅 Topic 下指定的 Partition,然后从 Broker 中读取消息,进行消费处理。
Kafka 的核心原理
1 Topic
Topic 是构成 Kafka 消息消费模型的重要基础,相当于消息的主题或标签,一个 Topic 可以包含多条消息。Topic 在设计时需要注意,以便后续的扩容和维护。在 Topic 的设计上,可以考虑以下因素:
- 分布式:Topic 要支持多线程和多进程并行处理,需要支持分布式存储;
- 扩容性:Topic 应该支持水平扩展,以适应多量级的数据;
- 消息订阅性:Topic 可以由多个 Subscriber(订阅者)进行订阅,Subscriber 可以同时订阅多个 Topic;
- 消息传递方式:Topic 的消息传递应该基于异步、不可靠和顺序不保证的原则。
- Partition
Partition 代表着 Topic 的分区,可以将一个 Topic 分成多个 Partition,每个 Partition 单独存储数据,并且拥有独自的索引。Partition 在 Kafka 内部被用于分布式数据存储、分布式处理和负载均衡。
Partition 可以保证存储在其中的消息是有序的,并且可以有效地支持扩容,提高 Topic 的吞吐量。Kafka 支持在 Producer 增加数据到指定 Partition 中,Consumer 从指定 Partition 中消费数据,也可以通过指示 Partition 来控制数据的存储和消费。
- Topic Offsets
Topic Offsets 表示 Partition 中消息的位置,每个 Partition 都有自己的 Offsets,用于跟踪其消费进度。这可以保证 Consumer 在下一次读写时,可以从上次消费的位置继续读取而不会重复消费。
- Replica
Kafka 采用副本机制实现数据可靠性,每个 Partition 可以有多个副本。副本分为两种类型,首领副本和追随者副本。首领副本被用于处理 Producer 发送的写请求,追随者副本不参与写操作,只负责复制从首领副本发来的消息。在首领副本崩溃或不可用时,Kafka 会自动地从追随者副本中选举一台作为新首领。
- Producer
Producer 用于生成消息并将其发送到 Broker 上,可以向特定 Topic、Partition 发送消息。在发送消息时,Producer 可以指定消息的 Key 来确保消息被发送到指定的 Partition 中。Produce 可以根据异常类型调整消息的发送方式,提高消息的可靠性和稳定性。
- Consumer
Consumer 主要用于订阅 Topic 下的 Partition,从 Broker 中取出消息进行消费处理。Consumer 可以被启动多个实例,每个实例代表一个 Consumer 进程组。消息在 Consumer 里面被处理后,可以提交确认消费,也可以进行 Rebalance 操作。
总结
Apache Kafka 是一种高可扩展且可靠的消息平台,可以支持高吞吐量的数据传输、并发访问、水平扩展和持久性存储等特性。Kafka 主要由 Topic、Partition、Replica、Producer 和 Consumer 组成。Admin API 可以监测指定 Topic 的状态、创建 Partition、修改 Partition 属性、扩容 Broker 等操作。Kafka 这样的处理模型在消息传递和系统设计中具有重要的应用价值和普及前景。