跳至正文
来两杯美式
返回

Kafka(上):特性、应用场景与消息传递保障

By 来两杯美式
发布于更新于

RabbitMQ 系列讲完之后,本篇切换到 Kafka。和 Rabbit 不同,Kafka 的定位不是 MQ——它是「分布式流处理平台」。这个根本性的定位差异决定了它和 RabbitMQ 的所有不同:吞吐量、消息可靠性、有序性、消费模型。本系列 3 篇,先从「它是什么、能干嘛、消息怎么保证不丢」讲起。

一、Kafka 是什么

Kafka 是一个分布式流处理平台(Distributed Streaming Platform)。它提供三大能力:

  1. 发布订阅消息流(类似 MQ)
  2. 容错的方式存储流记录
  3. 实时处理流记录

关键词是「」——Kafka 把消息当成持续不断的流来处理,而不是「一条一条的消息」。这个定位决定了它在大数据、日志、监控领域的统治地位。

1.1 Kafka 的核心特性

重复消费」是 Kafka 与传统 MQ 最大的区别之一:传统 MQ 消息被消费后就删除,Kafka 的消息可以保留几天甚至几个月——消费完后只是 offset 移动,下次可以从任意 offset 重新消费。这是流处理的基础

二、四大典型应用场景

场景描述
日志收集把分布式系统的日志统一汇聚到 Kafka,再落到 ES / HDFS
流式系统配合 Spark Streaming / Flink 做实时计算
消息系统业务消息总线(对消息有序性不在意的场景)
用户活动跟踪 / 运营指标监控用户行为埋点、实时大盘

大厂的「埋点 → Kafka → 实时计算 → 大盘」几乎是标配。你今天在淘宝点的每一颗按钮,都通过 Kafka 流到了下游

三、核心概念速览

理解 Kafka,必须先把这几个名词搞清楚:

概念含义
Broker一个 Kafka 服务节点
Topic消息主题,逻辑分类(如 user_action
PartitionTopic 的物理分片,并行单元
Producer消息生产者
Consumer消息消费者
Consumer Group消费者组,组内分摊消费、组间独立消费
Offset消费者在 partition 中的位置游标
Replica副本(leader / follower)
ISRIn-Sync Replicas,与 leader 保持同步的副本集合
Topic: order-events(3 个 partition)
   ├── Partition 0  →  [msg0, msg1, msg2, msg3, ...]
   ├── Partition 1  →  [msg0, msg1, msg2, ...]
   └── Partition 2  →  [msg0, msg1, msg2, msg3, msg4, ...]

partition 是 Kafka 高吞吐的物理基础——不同 partition 可以并行读写。partition 数量直接决定并发上限

四、Kafka 与 RabbitMQ 的定位差异

回顾 MQ 选型对比,再补一张 Kafka vs RabbitMQ 的细化表:

维度RabbitMQKafka
定位消息队列流处理平台
单机吞吐万级十万级
延迟μs 级ms 级
消息模型队列(消费即删除)日志(按 offset 消费、可重放)
路由能力(Exchange + routing key)弱(按 topic 订阅)
有序性队列内有序partition 内有序
消息堆积内存/磁盘,堆积会拖垮性能天生为堆积设计
事务消息支持(0.11+ Transactions)
典型场景业务消息、复杂路由大数据、日志、流处理

不是二选一,而是各管一头——很多大公司同时用 RabbitMQ(业务消息)和 Kafka(大数据)。业务消息走 Rabbit,埋点日志走 Kafka

五、消息传递保障(核心)

这是 Kafka 最重要的一节。配置项:ACKS_CONFIG(生产者侧)。

消息传递有三种语义

语义acks 值消息消费次数性能适用场景
最多一次(At most once)00 ~ 1 次最好允许丢的指标/日志
至少一次(At least once)11 ~ 多次中等大多数业务
只有一次(Exactly once)all1 次最差计费、交易

5.1 最多一次(acks = 0)

适用:允许丢失的指标数据——比如每秒一次的 CPU 监控,丢一条无所谓,下一秒还会有。

5.2 至少一次(acks = 1)

这是 Kafka 的默认值。生产环境的最低保障,配合重试可以达到「至少一次」。

5.3 只有一次(acks = all)

acks = all:
  Producer → Leader → 等待所有 ISR 写入 → 返回 ack

              Follower1 ✅
              Follower2 ✅  ← 全部确认后才算成功

Kafka 在 0.11 版本(2017 年)就引入了 Exactly-Once Producer 语义——通过 PID(Producer ID)+ Sequence Number 实现幂等发送,配合事务 API 可以实现”只有一次”。本文发布于 2018 年 5 月,当时 Kafka 1.1 已具备完整的 exactly-once 能力,不是 2.5 才引入。重要数据(计费、交易、扣款)必须用 all + Transactions

5.4 怎么选

业务类型推荐 acks
日志、监控埋点0
普通业务消息1(默认)
订单、支付、扣款all
流处理 Exactly-Onceall + Transactions

生产建议:核心业务一律 all,宁可慢也不要丢;埋点和日志 01 即可,吞吐量第一。

六、Kafka 为什么这么快(预告)

本篇不展开,下一篇「Kafka(中)」会详细讲。这里先给结论:

这四条加起来,让单机 Kafka 能扛住十万级 TPS。下一篇会把每一条掰开揉碎讲,包括零拷贝为什么从 4 步变成 2 步

七、小结

概念一句话
Kafka 定位流处理平台(不是 MQ)
核心特性高吞吐、partition 并行、可重放
典型场景日志、流处理、监控、消息总线
三种语义at-most-once / at-least-once / exactly-once
生产核心配置acks(0/1/all)

下一篇「Kafka(中):吞吐量为什么这么大——日志、零拷贝、批量」进入 Kafka 的「性能原理」——为什么它能扛住十万 TPS,磁盘 IO 是怎么被榨干的。

现代视角补一句(2026):到 2026 年,Kafka 的 KRaft 模式已经成熟——不再依赖 ZooKeeper,元数据用 Raft 自管理。同时 Partition Tiered Storage(分层存储)让 Kafka 能堆 TB 级数据而不用每个 broker 都扛全量。但 acks 三档语义、partition 并行模型——这些 2018 年的设计到现在一点没变


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
所属专题
Kafka
第 1 / 3 篇
查看系列全部文章
  1. 01.Kafka(上):特性、应用场景与消息传递保障
  2. 02.Kafka(中):吞吐量为什么这么大——日志、零拷贝、批量
  3. 03.Kafka(下):消费者、消息有序性、命令与集群搭建

上一篇
Kafka(中):吞吐量为什么这么大——日志、零拷贝、批量
下一篇
消息队列(末):RabbitMQ 集群与高可用四种模式