Skip to content

Kafka 快速入门

大数据:

  • 如何收集数据
  • 如何分析数据
    • 离线分析
    • 实时分析

消息收发模式:

  • 点对点模式: 消息最多只能被一个消费者消费, 可以有多个消费者
  • 发布订阅模式: 消费者可以订阅多个主题, 消费该主题中的所有消息

kafka是什么?事件流平台, 消息队列

大数据组件:

  • 数据收集
  • 数据存储
  • 离线计算
  • 流式实时计算
  • 机器学习

事件流

事件流的形式从数据库、传感器、移动设备、云服务和软件应用程序等事件源实时捕获数据的实践

Apache Kafka是一个事件流平台。

功能

  1. 发布/订阅事件流,写入/读取事件流,导入/导出数据
  2. 持久可靠地存储事件流
  3. 处理事件流

为什么要使用Kafka?

  1. 削峰填谷。应对瞬时突发流量
  2. 解耦。允许独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
  3. 异步通信,即允许把一个消息放入队列,但并不立即处理它们,然后再需要的时候才去处理它们。

工作原理简介

通过TCP协议进行通信的服务器客户端组成。

是一个分布式系统。

服务器:以集群模式运行。

客户端:各种编程语言库。

实践案例

外卖系统

  • 生产者:
    • 订单微服务
  • 消费者:
    • 商家微服务
    • 配送员微服务

核心概念

事件 event

记录了应用中“发生了一些事情”的事实。在文档中也称为记录(record)消息(message)

事件具有键、值、时间戳和可选的元数据标头

代理 Broker

服务代理节点。Broker 是 Kafka 的服务节点,即 Kafka 的服务器。

生产者 Producer

发布事件,写入操作

消费者 Consumer

订阅事件,读取、处理操作

主题 Topic

主题类似于文件系统中的文件夹,事件是该文件夹中的文件。

分区 Partition

Topic是分区的,一个Topic可以有多个Partition

一个Topic分布在位于不同 Kafka Broker上的多个“桶”中。

一个 Topic 对应的多个 partition 分散存储到集群中的多个 broker 上

消息位移 Offset

Partition中每条message的位置信息,是一个单调递增且不变的值

副本 Replica

分区副本。每个分区可配置多个副本实现高可用。

同一 Partition 的数据可以在多 Broker 上存在多个副本

每个 partition 选举一个 server 作为“leader”

主副本 leader

leader partition 负责读写

从副本 follower

follower 负责与 leader 同步数据

Kafka

层级关系:

  • Topic A
    • Partition-0
      • Leader (Broker-0)
      • Follower (Broker-1)
      • Follower (Broker-2)
    • Partition-1
      • Follower (Broker-0)
      • Leader (Broker-1)
      • Follower (Broker-2)
  • Topic B
    • Partition-0
      • Follower (Broker-0)
      • Leader (Broker-1)
      • Follower (Broker-2)
    • Partition-1
      • Leader (Broker-0)
      • Follower (Broker-1)
      • Follower (Broker-2)

消费者组 Consumer Group

多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。

一个CG内, 一个Consumer可以对应多个Partition, 一个 partition只能对应一个consumer

消费者位移 Consumer Offset

表示消费者消费进度,每个消费者都有自己的消费者位移。

重平衡 rebalance

消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。

生产者发送数据:

  • 参数 topic, partition, key, value
  • 存在key, 根据key hash 选择 partition
  • 不存在key, 轮询 选择 partition
  • 批量发送

消费者消费数据:

  • 以消费者组(Consumer Group)为单位, 订阅消息
  • 点对点: 每个消费者的CG组都一样
  • 广播: 每个消费者的CG组都不一样
  • 同一个CG组的消费者不会同时消费同一个partition
  • partition数 > 同一个CG组的消费者数: 会导致 某个consumer 消费2个partition
  • partition数 < 同一个CG组的消费者数: 会导致 某个consumer 消费不到 partition

消息投递语义:

  • Exactly Once: 有且仅有一次, 消息不丢失不重复, 且只消费一次
  • At least once 最少一次, 消息不丢失, 可能重复
  • At most once 最多一次, 消息不重复, 可能丢失

kafka集群核心组件:

  • Broker 负责收发消息
  • ZooKeeper, kafka4.0 已被KRaft取代, 负责故障转换, 主副切换
  • Producer 负责发送消息
  • Consumer 负责拉取消息

工作流程1: 发布/订阅消息的流程

  • Producer 向topic 发送 消息
  • Broker 存储该 topic 的消息, 分发到不同的partition
  • consumer 订阅 topic, broker 向 consumer 提供 offset
  • consumer 定期 pull 新消息
  • broker 收到消息, 转发给consumer
  • consumer 处理消息
  • consumer 向 broker 发送消息确认
  • broker 收到确认, 更新 offset 值
  • 重复以上流程

工作流程2: 同CG组消费流程

  • producer向topic发送消息
  • broker 存储该topic的消息, 分发到不同的partition
  • 消费者C1加入CG1订阅topic
  • broker 以 发布订阅方式与 C1 交互
  • 消费者C2加入CG2订阅topic, broker 切换为共享模式
  • CG1订阅topic下的消费者数大于topic 的 partition 数, 新消费者将不会接受任何消息

zookeeper

  • partition 的 leader选举
  • 元数据存储

Kafka API

Admin API

用于管理

Producer API

用于将事件流发布(写入)到一个或多个 Kafka 主题。

Consumer API

用于订阅(读取)一个或多个主题并处理为其生成的事件流。

Streams API

用于实现流处理应用程序和微服务。提供了更高级别的函数来处理事件流

Connect API

用于构建和运行可重用的数据导入/导出连接器

应用场景

  • 消息队列
    • Kafka、ActiveMQ、RabbitMQ的对比
  • 网站活动跟踪
  • 指标监控
  • 日志聚合
  • 流处理
  • 事件溯源
  • 提交日志

快速入门

安装并配置Java

下载并解压

bash
# 下载
wget https://downloads.apache.org/kafka/3.9.2/kafka_2.12-3.9.2.tgz
# 解压
tar -zxf kafka_2.12-3.9.2.tgz && cd kafka_2.12-3.9.2 
# 启动 zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties

# 修改kafka配置 config/server.properties
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://本机IP:9092

# 启动 kafka
bin/kafka-server-start.sh config/server.properties

方式一 zookeeper

启动zookeeper

bash
bin/zookeeper-server-start.sh config/zookeeper.properties

启动kafka

bash
bin/kafka-server-start.sh config/server.properties

方式二 kraft

生成集群 UUID

bash
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"

设置日志目录格式

bash
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties

启动Kafka服务器

bash
bin/kafka-server-start.sh config/kraft/server.properties

zookeeper和kraft只能任选其一

创建主题 topic

bash
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092

查看topic

bash
# 查看所有topic
bin/kafka-topics.sh --list --bootstrap-server localhost:9092 
# 查看某个topic
bin/kafka-topics.sh --describe --topic quick-start-events 
--bootstrap-server localhost:9092

写入事件

bash
bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
This is my first event
This is my second event

获取事件

bash
bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
This is my first event
This is my second event

资源推荐

图形化界面

https://github.com/lichengchuan/KafkaWebUIByLCC

书籍

  • 《kafka权威指南》
  • 《kafka技术内幕》
  • 《kafka实战》
  • 《kafka stream实战》
  • 《Apache Kafka源码剖析》
  • 深入理解Kafka:核心设计与实践原理
  • 胡夕《Kafka实战》, 入门
  • 朱忠华的《深入理解Kafka:核心设计与实践原理》, 进阶
  • 郑奇煌的《Kafka技术内幕》, 高级
  • 石臻臻的《石臻臻的杂货铺》, 实战

知识体系

基础

  1. Kafka 是什么? WHAT
  2. Kafka 解决了什么问题? WHY
  3. Kafka 怎么使用 ? HOW

重点

  1. 为什么 Kafka 吞吐量高?

  2. 为什么能做到“顺序写 + 零拷贝”?

核心

  1. 掌握Kafka的核心概念, 及其交互流程

概念

  • Broker
  • Topic
  • Partition
  • Producer
  • Consumer
  • Consumer Group
  • Offset

重点

  • Topic 为什么要分区?
  • Consumer Group 如何实现负载均衡?
  • Offset 是怎么管理的?
  • Kafka 如何保证顺序性?
  • Kafka 如何保证可靠性?生产端/消费端/broker端
  • Kafka 如何避免重复消费?
  • Kfaka 如何排查消息积压?
  • 如何实现延迟消息?
  • 如何处理消费失败?

架构原理

存储结构

  • Log Segment
  • Index 文件
  • 顺序写磁盘
  • Page Cache

高性能机制

  • 零拷贝(Zero Copy)
  • 批量发送(Batch)
  • 压缩(Snappy / LZ4)

副本机制

  • ISR(In-Sync Replica)
  • Leader / Follower
  • AR / ISR / OSR 区别

数据可靠性

怎样才能做到消费时, 既不丢失, 也不重复?

生产者可靠性

  • ACK 机制(0 / 1 / -1)
  • 重试机制
  • 幂等性(Idempotent Producer)
  • 事务消息(Exactly Once)

消费者可靠性

  • 自动提交 vs 手动提交
  • 重复消费问题
  • 消费幂等设计

其他特性

  • 事务(Exactly Once 语义)
  • Kafka Streams
  • KSQL(流式 SQL)
  • 延迟队列实现
  • 死信队列(DLQ)

源码底层

  • Producer 发送流程
  • Consumer 拉取流程
  • Rebalance 机制
  • Controller 选举

Rebalance机制

  • 分区分配策略(Range / RoundRobin / Sticky)
  • Rebalance 为什么会卡顿?
  • 如何优化 Rebalance?

运维与调优

部署模式

  • 单节点 / 集群
  • ZooKeeper(旧) vs KRaft(新)

常见调优点

  • 分区数怎么设计?
  • 副本数怎么设置?
  • 磁盘 vs 网络瓶颈
  • 消费堆积如何处理?

项目实践

项目1:日志收集系统

  • Nginx → Kafka → ES
  • 技术点:
    • 高吞吐
    • 批量发送
    • 数据分区设计

项目2:订单异步处理系统

  • 下单 → Kafka → 库存 / 支付 / 通知
  • 技术点:
    • 解耦
    • 消费失败重试
    • 幂等设计

项目3:实时数据分析系统

  • Kafka → Flink → ClickHouse
  • 技术点:
    • 流式计算
    • 实时指标

其他

  • 亿级流量日志系统怎么设计?
  • Kafka 如何做削峰填谷?
  • 如何避免消息积压?
  • Kafka 和数据库如何保证一致性?

Kafak进阶

网络协议模型

  • Kafka 自定义二进制协议(不是 HTTP)
  • 请求类型(Produce / Fetch / Metadata)
  • 网络模型(NIO / Selector)
  • 长连接 + 多路复用

直接决定:

  • 延迟为什么低
  • 为什么能支撑百万 QPS
  • Producer 为什么能 batch

时间轮(Timing Wheel)机制

应用场景

  • 延迟操作
  • 请求超时管理

为什么重要?

👉 Kafka 的很多“定时行为”不是简单 Timer,而是高性能时间轮

Controller & 集群元数据(KRaft)

必补内容

  • Controller 是什么
  • Leader 选举机制
  • 元数据存储方式对比(ZK vs KRaft)

KRaft(重点)

  • 基于 Raft 协议
  • 去 ZooKeeper
  • 元数据日志化

Rebalance

深入点

  • Rebalance 触发条件
  • Stop-The-World 问题
  • Cooperative Rebalance(新机制)

实战问题

  • 为什么消费会“突然卡死”?
  • 为什么 CPU 飙升?
  • 为什么重复消费?

数据语义(Exactly Once )

三种语义

  • At Most Once
  • At Least Once
  • Exactly Once(重点)

背压(Backpressure)机制

  • 消费跟不上怎么办?
  • 如何限流?
  • Producer 如何感知压力?

相关参数

  • linger.ms
  • batch.size
  • fetch.min.bytes

日志压缩(Log Compaction)

作用

  • 保留 Key 最新值
  • 做状态存储

应用场景

  • 用户画像
  • 配置中心
  • CDC(变更数据捕获)

必备组件

  • Kafka Connect(数据集成神器)
  • Schema Registry(Avro / Protobuf)
  • Debezium(CDC)

8大板块

  1. 数据模型(Topic / Partition)
  2. 存储引擎(Log + Segment)
  3. 网络模型(NIO + 协议)
  4. 副本机制(ISR + Leader)
  5. 一致性(ACK / 事务 / EOS)
  6. 调度机制(Rebalance / 时间轮)
  7. 集群控制(Controller / KRaft)
  8. 生态系统(Connect / Streams)

基于 MIT 许可发布