Kafka 与 Pulsar:我们来回切换的故事
选型不是单选题。我们曾因为分层存储和 topic expansion 从 Kafka 切到 Pulsar,又在两年后因为运维复杂度切了回来。这条路值得复盘。
2022 年我们因为两个痛点从 Kafka 切到了 Pulsar:一是 topic 数量突破 5000 后 controller 抖动;二是冷数据想下沉到 S3 但 Kafka 那时还没原生支持。两年后,我们又把核心业务切回了 Kafka。这一来一回的复盘,可能比任何"选型对比"文章都更真实。
为什么离开 Kafka
2022 年的痛点是真实的。Kafka 在 topic 多了之后的几个具体问题:
- Controller 在 5000+ topic 时元数据同步慢,新 broker 上线时 cluster state 推送要 30 秒。
- partition rebalance 期间吞吐明显抖动。
- 分层存储当时还在 KIP-405 阶段,未正式发布。
而 Pulsar 的"分层存储原生支持"+"计算与存储分离"看起来正好对应这些痛点。
Pulsar 的优势确实存在
切过去后,几个收益是实打实的:
| 能力 | Kafka(2022) | Pulsar |
|---|---|---|
| topic 数量 | 5000+ 抖动 | 无感(broker 无状态) |
| 冷数据下沉 | 需自己实现 | 原生 tiered storage |
| 扩容速度 | 慢(需搬 partition) | 快(broker 无状态) |
| 多租户 | 弱 | 原生支持 |
这些收益让我们在 2022–2024 两年里跑得还不错。
为什么又切回 Kafka
两年后切回来,原因不是 Pulsar"不好",而是它的"复杂度成本"在我们这个规模下不划算。具体问题:
- 运维链路长:Pulsar = broker + bookkeeper + zookeeper 三套组件。任何一个出问题都要查。Kafka 只有一套。
- BookKeeper 抖动:bookie 的 journal 写盘对 IO 敏感,跟其他服务混布时容易抖。
- 社区与生态:Kafka 生态远比 Pulsar 丰富。从 Kafka Connect 到 Debezium 到各种 Sink,Pulsar 都要"找替代"。
- Kafka 进步了:KRaft 模式去掉了 ZooKeeper;分层存储 KIP-405 在 3.6 正式发布;topic 数量在 KRaft 下显著改善。
当我们把"离开 Kafka 的痛点"逐条对照 Kafka 2024 的版本,发现大部分已经不再是问题。
选型最危险的时刻,是"为新工具的优点激动,但忘了评估原工具也在演进"。
切换的代价
来回切换不是免费的:
- 迁移工程:每次都要写双写、对账、灰度切流、回滚预案。两年时间里有 4 个月在迁移上。
- 团队学习:Pulsar 的概念模型(topic subscription vs consumer group)与 Kafka 不同,团队要重新熟悉。
- 监控体系:两套指标体系,告警规则要重写。
这次切回来后我们算了总账:来回切换的工程成本,约等于"用 Kafka 顶两年再升级到 KRaft"的 3 倍。
Kafka 2024 解决了什么
切回来后,对比 2022 的痛点:
- Controller 抖动:KRaft 模式下元数据走 Raft,5000+ topic 推送 < 3 秒。
- 扩容:partition reassignment 仍需手动触发,但速度更快。
- 分层存储:KIP-405 在 3.6 GA,冷数据自动下沉到 S3/OSS。
没解决但能接受的:多租户仍弱(我们用 namespace + quota 模拟);broker 状态仍"有"(不像 Pulsar broker 真无状态),但 KRaft 让扩容快很多。
Pulsar 什么时候仍然值得选
不是说 Pulsar 不好,是"我们的规模下不划算"。Pulsar 仍然适合的场景:
- topic 数量 10 万级别(Kafka 仍吃力)。
- 多租户强隔离(Pulsar 原生支持)。
- 需要 geo-replication(Pulsar 内建,Kafka 要 MirrorMaker2)。
- 团队对 BookKeeper 有经验。
选型方法论
这次来回切换让我学到几条选型纪律:
- 评估"现状"也要评估"演进"。今天的痛点可能是明天的修复。
- 把"运维复杂度"算进 TCO。Pulsar 的三套组件每年多出 X 人月运维成本,要算进去。
- 试运行而不是评估。我们切 Pulsar 前跑了 1 个月试运行,但仍没暴露 BookKeeper 的 IO 抖动——因为它只在多租户混布时出现。
- 切换成本是沉没成本。别为了"已经投了"就硬撑。
给在选型里的同学几句话
- Kafka 与 Pulsar 都成熟,没有"谁更好",只有"谁更适合"。
- 团队的熟悉度比工具的"先进性"更重要。
- 迁移成本永远比你预估的高 2 倍。
- 选完就别犹豫,把精力放在用好它。
这件事过后,我不再相信"哪个工具更好"这类讨论。真正的工程问题不是"选哪个",而是"如何让选定的那个跑稳"。这后者,需要的是耐心与纪律。