中间件速查手册
消息队列 · kafka

Kafka

一个能存住海量消息的高吞吐分布式消息队列

消息队列Apache-2.0Java / Scala学习难度:较难

Kafka 最早是 LinkedIn 用来收日志的,后来变成事实上的“数据总线”。它把消息按 Topic 分片、按顺序追加到磁盘,生产者和消费者互不等待,所以能做到百万级吞吐,还能让消息保留好几天供多个下游重复消费。

01

它解决什么问题

系统 A 每秒产生几万条日志和事件,系统 B、C、D 都要用。如果 A 直接调用它们,A 会被拖死,新增一个下游还要改 A 的代码。

真实场景:典型场景:订单服务把“订单已支付”事件写进 Kafka,风控、积分、推荐、数仓四套系统各自按自己的节奏消费,互不影响。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

一条消息从 Producer 到 Consumer 的完整路径

Producer发送端Topicorder-eventsPartition 0offset 0 → 1Partition 1offset 0Consumer Group2 个消费者分摊

← 左右滑动查看完整流程图 →

01 / 05
1. 生产并选分区

Producer 把消息序列化、按 key 哈希选出 Partition 0,攒成一批再发。

提示:注意 offset 的推进:消息只会追加,消费者只是移动自己的书签。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • 吞吐极高,百万级消息/秒
  • 消息可保留数天,支持多个下游重复消费
  • 分区水平扩展,加机器就能扩容
  • 生态成熟,流处理(Flink/Spark)默认搭档
不适合什么
  • 不支持事务消息(只有事务写,不是业务事务)
  • 没有原生延迟消息、消息优先级
  • Topic 多时运维和元数据压力大
  • 部署依赖 ZooKeeper 或 KRaft,门槛偏高
05

常见使用场景

每个场景都配一句「为什么用它」。

01

日志与埋点采集

前端/后端埋点统一写进 Kafka,数仓、监控、告警分别消费。

为什么用它:写入吞吐高,允许短暂堆积,丢一条日志也不影响业务。

02

事件驱动的微服务

订单、库存、积分服务之间用事件通信,而不是互相调用。

为什么用它:下游可以随时新增,上游不需要改代码。

03

流式计算的数据源

Flink 从 Kafka 读实时数据,做实时大屏和风控。

为什么用它:分区内有序 + 可回溯,天然适合流处理。

06

同类对比

和同赛道的组件并排看,差异一目了然。

KafkaRocketMQRabbitMQ

一句话:吞吐选 Kafka,业务语义选 RocketMQ,路由灵活和轻量选 RabbitMQ。三者不是替代关系,很多公司同时用两个。

打开对比页
07

常见问题

上手第一个月最容易卡住的地方。

Q1Kafka 怎么保证消息顺序?

只能保证同一个 Partition 内有序,跨分区不保证。要全局有序只能把 Topic 设成 1 个分区,代价是没有并行度;通常做法是把需要有序的消息用同一个 key(比如订单号)打到同一个分区。

Q2为什么 Kafka 吞吐这么高?

四件事:顺序写磁盘、批量发送(batch)、零拷贝(sendfile)、分区并行。再加上消费者自己维护 offset,服务端不做逐条确认。

Q3Kafka 和 RocketMQ 怎么选?

日志、埋点、流处理选 Kafka;电商交易、需要事务消息/延迟消息/顺序消息选 RocketMQ。前者吞吐更高生态更好,后者业务语义更全、运维更轻。

Q4消息会不会丢?

三个环节都要配:生产者 acks=all + 重试;Broker 设置 replication.factor≥3、min.insync.replicas≥2;消费者关闭自动提交,处理完再手动提交 offset。

Q5消费者组里消费者比分区多会怎样?

多出来的消费者分不到分区,会空转。所以并行度上限就是分区数,扩容消费者前先看分区够不够。