从 LinkedIn 到 Apache:Kafka 的架构设计与应用场景

【博客标题】

Kafka 全景入门:从诞生背景到生产实战,一文讲透核心架构、特性以及与RabbitMQ的对比


一、为什么要读这篇文章?

如果你正在调研消息中间件,或者刚接触 Kafka 却被「Broker / Partition / Consumer Group / Offset」等概念绕晕,那么这份课堂级笔记刚好能帮你把碎片化的知识点串成体系。

博客思维导图:


二、Kafka 的诞生故事:业务倒逼技术

  1. 背景
    2010 年前后的 LinkedIn 每天要处理 7 万亿条实时数据,早期点对点集成、ActiveMQ 都扛不住,经常阻塞。
  2. 结果
    LinkedIn 自研 Kafka,并于 2011 年捐给 Apache,名字取自小说家 卡夫卡(Franz Kafka)。
  3. 启示
    业务复杂度 → 技术挑战 → 技术突破,这套逻辑在今天做架构选型时依旧适用。

三、Kafka 到底是什么?

官方给的定位是 "分布式流处理平台",不仅仅是一个消息队列(MQ)。它同时扮演 3 个角色:

  • 消息引擎:高吞吐、低延迟发布/订阅
  • 存储系统:消息持久化到磁盘,可重放
  • 流处理平台:自带 Kafka Streams API,可做实时计算

四、核心概念速记(面试高频)

概念 一句话解释
Broker Kafka 服务器节点,默认端口 9092
Topic 逻辑队列,消息的一级分类
Partition 对 Topic 做水平分片,解决扩展 & 并发
Replica 每个 Partition 的多份拷贝,保证高可用
Leader / Follower 读写只走 Leader,Follower 异步同步
Segment Partition 再按文件切分,便于检索与清理
Consumer Group 一组消费者并行消费,Partition 只能被同组内一个实例占用
Offset 消息在 Partition 中的"下标",由 Consumer 自己维护(老版本在 ZK,现存在 __consumer_offsets Topic)

五、常见使用场景

  1. 消息传递:异步、解耦、削峰,比 RabbitMQ 吞吐量更高
  2. 网站活动追踪:点击流实时上报 → 推荐系统
  3. 日志聚合:Logstash / Filebeat → Kafka → ELK
  4. 运营指标监控:CPU、内存、贷款放款数据实时看板
  5. 流式 ETL:Kafka Connect + Kafka Streams → Hadoop / HBase / Elasticsearch
  6. 数据同步:Canal 伪装 MySQL Slave 订阅 Binlog → Kafka → 下游系统

六、十分钟快速安装(CentOS 示例)

  1. 前置
    JDK 8+、ZooKeeper(单节点或集群)

  2. 下载
    kafka_2.13-3.2.0.tgz(2.13 是 Scala 版本,3.2.0 才是真正 Kafka 版本)

  3. 启动

    bash 复制代码
    # 启动自带 ZK(仅测试)
    bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
    
    # 启动 Kafka
    bin/kafka-server-start.sh -daemon config/server.properties
  4. 常用脚本

    • kafka-topics.sh 创建/查看 Topic
    • kafka-console-producer.sh 命令行发送
    • kafka-console-consumer.sh 命令行消费
    • kafka-consumer-groups.sh 查看消费进度
    • kafka-manager / kafka-eagle 可视化管理

七、Java 原生 API 速览

1. Producer 关键点
properties 复制代码
bootstrap.servers=broker1:9092,broker2:9092
acks=all                 # 高可靠
retries=3
batch.size=16384
linger.ms=5
2. Consumer 关键点
properties 复制代码
group.id=your-group
enable.auto.commit=true
auto.offset.reset=earliest
max.poll.records=500
3. 代码片段
java 复制代码
// 生产者
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("topicA", key, value));

// 消费者
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("topicA"));
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
    records.forEach(r -> System.out.printf("offset=%d, value=%s%n", r.offset(), r.value()));
}

八、Spring 生态集成

1. Spring for Apache Kafka
  • 依赖:spring-kafka
  • Template:KafkaTemplate<K,V> 一行发送
  • Listener@KafkaListener 注解消费
  • 配置application.yml 统一写生产者和消费者属性
2. Spring Boot 示例
yaml 复制代码
spring:
  kafka:
    bootstrap-servers: 192.168.8.147:9092
    producer:
      retries: 1
      batch-size: 16384
    consumer:
      group-id: boot-group
      auto-offset-reset: earliest

九、Kafka vs RabbitMQ:一张图看懂选型

维度 Kafka RabbitMQ
定位 流处理平台 消息代理
吞吐量 百万级 TPS 万级 TPS
延迟 毫秒级 亚毫秒级
消息顺序 Partition 级顺序 队列级顺序
路由灵活性 Topic/Partition 简单路由 Exchange + Binding 丰富
消息留存 可配置持久化,支持重放 消费完即删除
高级特性 流处理、Connect、MirrorMaker 延迟队列、优先级、死信队列
适用场景 大数据、日志、流计算 业务解耦、事务、复杂路由

一句话总结:

高吞吐 + 流处理 选 Kafka;复杂路由 + 低延迟 + 高级 MQ 特性 选 RabbitMQ。


十、学习路线 & 资料

  1. 官方文档
    http://kafka.apache.org/documentation
    https://kafka.apachecn.org (中文翻译)
  2. 书籍:《Kafka 权威指南》《深入理解 Kafka》
  3. 可视化:Kafka Manager、Kafka Eagle
  4. 实战
    • 用 Canal + Kafka 同步 MySQL → Elasticsearch
    • Kafka Streams 实时统计 UV
    • 搭建 3 Broker + 3 ZooKeeper 伪分布式集群

十一、启示

Kafka 的成功告诉我们:

"技术不是拍脑袋出来的,是被业务痛点逼出来的。"

当你面对海量数据、高并发、实时计算需求时,Kafka 大概率能救你于水火;但如果你只是想解耦下单和库存,RabbitMQ 可能更简单直接。希望这篇总结能让你在选型、面试、实战中都游刃有余。

相关推荐
架构师老Y20 小时前
011、消息队列应用:RabbitMQ、Kafka与Celery
python·架构·kafka·rabbitmq·ruby
talen_hx2961 天前
《kafka核心源码解读》学习笔记 Day 02
笔记·学习·kafka
lifallen1 天前
如何保证 Kafka 的消息顺序性?
java·大数据·分布式·kafka
真实的菜1 天前
Kafka 2.x vs 3.x,我为什么选择升级?
kafka
时光追逐者1 天前
分享四款开源且实用的 Kafka 管理工具
分布式·kafka·开源
Rick19931 天前
rabbitmq, rocketmq, kafka这三种消息如何分别保住可靠性,顺序性,以及应用场景?
kafka·rabbitmq·rocketmq
☞遠航☜1 天前
kafka快速上手
分布式·kafka·linq
工具罗某人2 天前
docker compose部署kafka集群搭建
docker·容器·kafka
大尚来也2 天前
告别“字符串拼接”:在.NET中用LINQ重塑数据查询
.net·solr·linq