1. 什么是 Kafka?
Kafka 是一个 分布式流处理平台,主要用来处理 实时数据流。它最初由 LinkedIn 开发,现在是 Apache 软件基金会的一个开源项目。
Kafka 通常被用作 消息队列 或 数据流处理系统,提供高吞吐量和高可靠性的实时数据分发能力。
Kafka特性:
- 发布/订阅 模型。
- 持久化数据存储。
- 高吞吐量、低延迟。
- 横向扩展能力。
2. Kafka 的核心概念
2.1 核心组件
组件 | 描述 |
---|---|
Topic | 生产者将消息发送到指定的 Topic,消费者订阅 Topic 接收消息。 |
Partition | 每个 Topic 被分成若干分区,分区是 Kafka 中的存储单元。 |
Offset | 分区内消息的唯一标识,消费者通过 Offset 跟踪消息的位置。 |
Broker | Kafka 的服务器节点,负责存储和分发消息,一个 Kafka 集群由多个 Broker 组成。 |
Producer | 消息生产者,将消息发送到 Kafka。 |
Consumer | 消息消费者,从 Kafka 的分区中读取消息。 |
Consumer Group | 消费者组,多个消费者可以协作消费一个 Topic,确保分区被唯一消费。 |
ZooKeeper | Kafka 的元数据管理工具。 |
2.2 Kafka 的消息架构图
生产阶段:
producer将消息发送到Topic分区中去,写入leader目录中去
存储阶段:
每个leader会复制多个副本Segment 文件存储消息,支持高效的顺序写入和查询。
消费阶段:
Consumergroup 从分区的 Leader 拉取消息,按 Offset 跟踪消费进度。
2.3消息流转的详细流程
Producer发送消息:
1.选择一个目标Topic:
- Producer将消息发送给Topic分区
- Producer会指定一个Topic 进行发送
2.进行分区:
- Kafka使用分区策略进行分区
- 指定一个Partition来分配分区作为存储单元
- 没有指定的时候则采用轮询方式分配分区
3.将消息发送给分区下的leader:
- Producer通过Kafka与leader进行交互
- Producer将消息发送给分区下的leader
4.状态确认机制:
Producer可以配置状态来确认消息状态:
- 0:producer发送给broker就结束(速度最快,但是安全性最低)
- 1:producer发送给leader写入确认之后返回 (速度中等,安全性中等)
- all:所有的副本确认写入之后返回 (速度最慢,安全性最高)
Broker存储消息:
1.Leader写入消息:
分区里面的Leader负责接受producer发送的消息,分为三个文件.index .log .timeindex文件
其中.log是正真的消息存储文件,.index是索引文件,.timeindex是时间索引文件
2.复制Follower副本:
Follower副本会复制Leader里面的所有内容,作为同步,副本跟Leader是在同一个分区下面,但是分布在分布在不同的broker里面,Leader跟Follower副本是通过选举来实现的,如果当leader宕机的时候,会重新选取一个同步过的Follower副本来重新成为Leader然后在同步给其他Follower副本,这也是为什么Leader跟Follower副本没有在一个Broker下的原因,防止当一个Broker宕机的时候,消息丢失
3.消息持久化:
- 消息会写入磁盘的Segment文件进行存储
- 消息按照offset进行存储,支持快速检索
4.消息清理策略:
- 通过时间进行清理,默认超过7天之后会进行清除
- 通过大小进行清理,默认超过1G之后会进行清除
- 可以通过配置来设定具体的时间或者大小
Cusomer拉取消息:
Cusomer订阅Topic:
- Cusomergroup订阅一个或多个Topic
- Kafka会将分区分配给消费者组中的每一个消费者
- 每个分区只能被一个消费者消费
Cusomer消费消息:
- Cusomer从分区中的leader拉取消息
- 拉取的消息通过offset标识,cusomer可以通过offset指定从哪个消息开始拉取
消费策略:
- Cusomer会只消费最新的消息
- Cusomer从分区起始的offset开始消费消息
- Cusomer从指定的offset开始消费消息
3.Kafka的优缺点
优点:
- 高吞吐量:顺序写磁盘、批量处理消息。
- 持久化存储:消息可以保留指定时间,允许消费者重复读取。
- 分布式架构:支持水平扩展,轻松处理海量数据。
- 灵活消费模型:支持广播和分布式消费。
缺点:
- 存储占用较大,需合理规划存储资源。
4.kafka的使用场景
在电商系统中,kafka主要可以应用于记录用户行为,电商的访问量大的时候,用户行为量每天将会成倍增加,使用RabbitMQ进行订单用户的消息处理还可以,但是在应对大量的用户行为的时候,RabbitMQ就显得有些捉襟见肘了