当前位置: 首页 > article >正文

【kafka系列】架构、核心概念

Kafka 是一个分布式流处理平台,设计目标是高吞吐量、低延迟、可水平扩展,主要用于处理实时数据流。以下是 Kafka 的核心架构和关键概念,帮助你快速理解和使用它。


一、Kafka 核心架构

Kafka 的架构由多个组件协作完成,整体架构如下:

生产者(Producer)  -->  Kafka集群(Brokers) --> 消费者(Consumer)
          |                             |
          |-- ZooKeeper/KRaft(元数据管理)--|
1. 核心组件
  1. Producer(生产者)
    • 将数据发布到 Kafka 的 Topic 中。
    • 支持异步/同步发送、消息批量压缩、重试机制。
  1. Broker(服务节点)
    • Kafka 集群中的单个服务器,负责存储和处理数据。
    • 每个 Broker 可以管理多个 Topic 的分区。
  1. Consumer(消费者)
    • 从 Topic 中拉取(Pull)数据并进行处理。
    • 消费者以组(Consumer Group)形式工作,组内消费者共同消费一个 Topic。
  1. ZooKeeper/KRaft(元数据管理)
    • 旧版本:依赖 ZooKeeper 管理集群元数据(如 Broker 注册、Topic 配置、Controller 选举)。
    • 新版本(Kafka 3.4+):逐步迁移到 KRaft 模式(基于 Raft 协议的内置元数据管理),不再依赖 ZooKeeper。
  1. Topic(主题)
    • 数据的逻辑分类,生产者向 Topic 写入数据,消费者从 Topic 读取数据。
  1. Partition(分区)
    • Topic 的物理分片,每个 Partition 是一个有序、不可变的消息序列。
    • 分区的作用:提高并行度和吞吐量(不同分区可分布到不同 Broker)。
  1. Replica(副本)
    • 每个 Partition 有多个副本(Replica),分为 Leader 和 Follower。
    • Leader:处理所有读写请求。
    • Follower:从 Leader 同步数据,实现高可用。

二、Kafka 核心概念

1. 消息存储模型
  • 消息(Record)
    • 由 Key、Value、Timestamp、Headers 组成。
    • 生产者发送的消息会被追加到 Partition 的末尾。
  • Offset(偏移量)
    • 每条消息在 Partition 中的唯一标识(类似数组下标)。
    • 消费者通过 Offset 记录消费进度。
  • Log Segment(日志段)
    • Partition 的物理存储由多个 Segment 文件组成(默认 1GB 一个文件)。
    • 每个 Segment 包含 .log(数据文件)和 .index(索引文件)。
2. 高可用机制
  • ISR(In-Sync Replicas)
    • 与 Leader 保持同步的副本集合。
    • 只有 ISR 中的副本才有资格被选举为 Leader。
  • Controller(控制器)
    • 集群中的一个特殊 Broker,负责 Partition 的 Leader 选举和副本分配。
    • 通过监听 ZooKeeper/KRaft 的元数据变化触发状态机更新。
3. 消费者组(Consumer Group)
  • 组内负载均衡
    • 一个 Consumer Group 中的多个消费者共同消费一个 Topic。
    • 每个 Partition 只能被组内的一个消费者消费。
  • 再平衡(Rebalance)
    • 当消费者加入或离开组时,Partition 会重新分配。
4. 消息传递语义
  • At Most Once:消息可能丢失,但不会重复。
  • At Least Once:消息不会丢失,但可能重复。
  • Exactly Once:消息不丢失且不重复(通过事务和幂等性实现)。

三、Kafka 工作流程

1. 生产者发送消息
  1. 生产者将消息发送到指定的 Topic。
  2. 根据 Partitioner 策略(如 Hash(Key))选择目标 Partition。
  3. 消息先写入内存缓冲区(RecordAccumulator),达到阈值后批量发送。
2. Broker 存储消息
  1. Broker 接收消息后,将其追加到对应 Partition 的 Log Segment。
  2. 数据按顺序写入磁盘(顺序 I/O 性能高)。
  3. 根据配置的副本数(replication.factor)同步到 Follower。
3. 消费者消费消息
  1. 消费者订阅 Topic,向 Broker 发起 Fetch 请求。
  2. 消费者按 Offset 顺序拉取消息,处理完成后提交 Offset。
  3. Offset 提交到 Kafka 内部 Topic __consumer_offsets

四、Kafka 使用场景

  1. 实时数据管道:将数据从源系统(如数据库、日志)传输到数据仓库或流处理系统。
  2. 日志聚合:集中收集分布式系统的日志数据。
  3. 事件驱动架构:处理用户行为事件(如点击、支付)。
  4. 流处理:结合 Kafka Streams 或 Flink 进行实时计算。

五、快速上手 Kafka

1. 安装与启动
# 下载 Kafka(以 3.6.1 版本为例)
wget https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz
tar -xzf kafka_2.13-3.6.1.tgz
cd kafka_2.13-3.6.1

# 启动 ZooKeeper(旧版本)或 KRaft 模式(新版本)
# KRaft 模式启动(不需要 ZooKeeper):
bin/kafka-storage.sh format -t $CLUSTER_ID -c config/kraft/server.properties
bin/kafka-server-start.sh config/kraft/server.properties
2. 基础操作
# 创建 Topic
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1

# 启动生产者(控制台)
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092

# 启动消费者(控制台)
bin/kafka-console-consumer.sh --topic test-topic --bootstrap-server localhost:9092 --from-beginning
3. Java 客户端示例
// 生产者
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("test-topic", "key", "value"));
producer.close();

// 消费者
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("test-topic"));
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        System.out.println(record.value());
    }
}

六、最佳实践

  1. 避免消息丢失
    • 生产者配置 acks=all
    • 消费者手动提交 Offset(enable.auto.commit=false)。
  1. 提高吞吐量
    • 生产者启用批处理(linger.msbatch.size)。
    • 消费者增加 fetch.min.bytesmax.poll.records
  1. 监控与运维
    • 使用 Kafka Manager、Prometheus + Grafana 监控集群状态。
    • 定期清理过期数据(log.retention.hours)。

总结

Kafka 的核心优势在于其分布式设计高吞吐量,理解以下关键点即可上手:

  1. Topic-Partition 模型:数据分片与并行处理。
  2. 副本机制:通过 ISR 保证高可用。
  3. 消费者组:负载均衡与水平扩展。
  4. 持久化存储:顺序 I/O 和零拷贝技术。

通过动手部署集群、编写生产/消费代码,结合官方文档逐步深入,你可以在实际项目中熟练使用 Kafka!


http://www.kler.cn/a/539614.html

相关文章:

  • windows生成SSL的PFX格式证书
  • C语言基础第04天:数据的输出和输出
  • 【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)
  • 计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
  • pytest.fixture
  • ant-design-vue通过ConfigProvide渲染Table组件中的单元格(如status)
  • DeepSeek + IDEA 辅助编程王炸组合
  • 模拟实现string类
  • Http ( Hypertext Transfer Protocol 超文本传输协议 )
  • spark技术基础知识
  • 前端工程化-vue项目
  • Ubuntu18.04安装DeepSeek
  • 【Linux网络编程】谈谈网络编程中的select、poll、epoll、Reactor、Proactor模型(下)
  • BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)
  • 基于STM32的智能鱼缸水质净化系统设计
  • Git 的高级配置与优化
  • Vue笔记(五)
  • 【RabbitMQ的重试配置retry】重试配置不生效原因
  • 火语言RPA--XML提取
  • 【C++】解锁<list>的正确姿势
  • 基于改进型灰狼优化算法(GWO)的无人机路径规划
  • 5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos
  • Flink-初识
  • DeepSeek 大模型每个版本的特点以及运用场景对比
  • PySide(PyQT)使用场景(QGraphicsScene)进行动态标注的一个demo
  • 【Java报错已解决】java.lang.UnsatisfiedLinkError