Kafka 是基于发布与订阅的消息系统。Kafka 是一个分布式的,可分区的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。
Kafka 的主要特点
- 1、同时为发布和订阅提供高吞吐量。据了解,Kafka 每秒可以生产约 25 万消息(50MB),每秒处理 55 万消息(110MB)。
- 2、可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL ,以及实时应用程序。通过将数据持久化到硬盘,以及replication ,可以防止数据丢失。
- 3、分布式系统,易于向外扩展。所有的 Producer、Broker 和Consumer 都会有多个,均为分布式的。并且,无需停机即可扩展机器。
- 4、消息被处理的状态是在 Consumer 端维护,而不是由 Broker 端维护。当失败时,能自动平衡。
Kafka 的设计要点
1.吞吐量:
- 1、数据磁盘持久化:消息不在内存中 Cache ,直接写入到磁盘,充分利用磁盘的顺序读写性能。
- 2、zero-copy:减少 IO 操作步骤
- 3、数据批量发送
- 4、数据压缩
- 5、Topic 划分为多个 Partition ,提高并行度。
数据在磁盘上存取代价为 O(1):Kafka以 Topic 来进行消息管理,每个 Topic 包含多个Partition
,每个 Partition 对应一个逻辑 log ,有多个 segment 文件组成。每个 segment 中存储多条消
息,消息 id 由其逻辑位置决定,即从消息 id 可直接定位到消息的存储位置,避免 id 到位置的
额外映射。每个 Partition 在内存中对应一个 index ,记录每个 segment 中的第一条消息移。
发布者发到某个 Topic 的消息会被均匀的分布到多个 Partition 上(随机或根据用户指定的回调
函数进行分布),Broker 收到发布消息往对应 Partition 的最后一个 segment 上添加该消息。
当某个 segment上 的消息条数达到配置值或消息发布时间超过阈值时,segment上 的消息会
被 flush 到磁盘,只有 flush 到磁盘上的消息订阅者才能订阅到,segment 达到一定的大小后
将不会再往该 segment 写数据,Broker 会创建新的 segment 文件。
2.负载均衡
- 1、Producer 根据用户指定的算法,将消息发送到指定的 Partition 中。
- 2、Topic 存在多个 Partition ,每个 Partition 有自己的replica ,每个 replica 分布在不同的 Broker 节点上。多个Partition 需要选取出 Leader partition ,Leader Partition 负责读写,并由 Zookeeper 负责 fail over 。
- 3、相同 Topic 的多个 Partition 会分配给不同的 Consumer 进行拉取消息,进行消费。
3.拉取系统
由于 Kafka Broker 会持久化数据,Broker 没有内存压力,因此, Consumer 非常适合采取 pull 的方式消费数据,具有以下几点好处:
- 1、简化 Kafka 设计。
- 2、Consumer 根据消费能力自主控制消息拉取速度。
- 3、Consumer 根据自身情况自主选择消费模式,例如批量,重复消费,从尾端开始消费等。
4.可扩展性:通过 Zookeeper 管理 Broker 与 Consumer 的动态加入与离开。
- 1、当需要增加 Broker 节点时,新增的 Broker 会向 Zookeeper 注册,而 Producer 及 Consumer 会根据注册在 Zookeeper 上的 watcher 感知这些变化,并及时作出调整。
- 2、当新增和删除 Consumer 节点时,相同 Topic 的多个 Partition 会分配给剩余的 Consumer 们。