在爱奇艺这种体量的平台里,实时流数据链路每天承载的不只是用户行为日志,还包括推荐特征、风险控制、实时数仓、运营大屏等一整套在线业务。Kafka 在这条链路里当了多年主力,稳定、可靠、生态成熟,一度让我觉得这个技术选型根本不需要再动。直到业务规模继续往上冲,集群节点越来越多,每一轮扩容、每一次分区重平衡、每一份存储成本都在提醒我们:Kafka 的架构红利已经被吃得差不多了。
后来我们开始调研 AutoMQ,并且一步步把核心链路从 Kafka 迁了过去。整个过程没有想象中那么惊险,但也绝不像换个依赖那么简单。这篇文章想把这段演进过程里真正关键的东西梳理出来:当初 Kafka 到底卡在哪里,AutoMQ 为什么能解决这些问题,迁移过程中我们怎么做到业务无感,以及最终的成本、延迟、运维收益到底有多少。不管你是正在做实时流数据架构选型,还是已经被 Kafka 集群运维折磨得想换赛道,这篇内容应该都能给你一些可以直接参考的判断依据。
1. Kafka 的高光与隐痛:爱奇艺实时链路里的功臣与瓶颈
1.1 高峰期三班倒,Kafka 集群成了最“操心”的基础设施
爱奇艺的业务峰值非常典型:晚间黄金档、热门剧集上线、节假日大促,流量曲线像过山车一样直上直下。实时流数据链路要跟着这条曲线走,Kafka 集群的压力也随之剧烈波动。为了扛住峰值,我们的做法和大多数团队一样——提前扩容、多预留节点、把副本因子拉高。这套打法在业务体量中等时完全够用,但体量大了以后问题就出来了:扩容后,分区重平衡(Rebalance)会带来额外的网络和磁盘开销,节点越多,重平衡的时间越长,甚至可能出现“扩容本身引发性能抖动”的怪圈。
我记得有一次做集群扩容,Broker 节点从 30 台加到 45 台,结果分区迁移整整跑了快三个小时,期间部分 Topic 的消费延迟明显爬升。这种经历多了以后,团队里对“扩容”这个词产生了条件反射式的警惕。Kafka 本身没错,它在分布式日志系统里依然是标杆级别的存在,但它的架构模型决定了,当集群规模大到一定程度,运维成本会非线性上涨。
1.2 分区与 Broker 的绑定关系,让存储和计算一起被锁死
Kafka 的经典架构里,一个 Topic 的分区会均匀分布在多个 Broker 上,每个 Broker 既负责计算(处理生产消费请求),又要负责存储(维护分区副本的本地日志)。这种设计的好处是简单、直接、不依赖外部存储,坏处也很明确:存储和计算的容量必须打包扩容。
举个例子,某个 Topic 的数据保留时间设了 7 天,单分区每天产生 100GB 数据,那这个 Topic 对磁盘的占用就是 700GB。但因为分区数对应的 Follower 副本要跟 Leader 保持同步,CPU 和内存也要跟着分区数量走。于是出现了一个很尴尬的局面:明明磁盘快满了,但 CPU 和内存利用率可能只有 20%;反过来,如果业务需要提高某个 Topic 的吞吐,加分区后磁盘空间又浪费了一大截。
在爱奇艺的场景里,这种“绑死”效应被放大得特别明显。实时计算任务往往有很明显的热点 Topic,而长尾 Topic 虽然数量多、数据量小,却仍然占据着 Broker 的元数据和文件句柄。到最后,集群里既有磁盘资源告急的节点,又有计算资源闲置的节点,但因为 Kafka 的分区归属是固定的,我们没法做精细化的资源调配。
1.3 云原生浪潮下,Kafka 集群的弹性短板被放大
爱奇艺的基础设施早就全面容器化了,计算任务可以秒级扩缩容,数据库也有成熟的云化方案。但 Kafka 这种“有状态”的分布式系统,在容器环境里一直处于“半云原生”状态:节点可以跑在容器里,但数据持久化、故障恢复、分区迁移这些底层操作,依然停留在传统物理机时代。
特别是当某个 Broker 节点故障时,Kafka 的副本恢复机制要从其他节点拉取全量数据,恢复时间取决于分区大小和网络带宽。在爱奇艺的体量下,一个分区可能就有几百 GB 的数据,恢复过程要几十分钟甚至更久。这几十分钟里,如果业务流量还在持续写入,整个集群的可用性和延迟都会受影响。
这些痛点叠加起来,让我们在 2023 年下半年开始认真思考一个问题:Kafka 的架构模型是不是已经跟不上我们的规模了?如果要换,新的方案必须具备哪些核心能力?
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么是 AutoMQ:存算分离背后的工程逻辑
2.1 存算分离不是口号,而是把日志存储交给云盘
AutoMQ 最核心的架构改动,是把 Kafka 原本耦合在一起的存储和计算拆开了。它使用云厂商提供的块存储(比如 EBS)作为底层存储引擎,Broker 节点本身只负责处理请求、维护缓存和索引。这样一来,分区数据不再是某个 Broker 的“私有财产”,而是存放在共享存储层上。
这里面的关键在于,AutoMQ 不是简单地把数据写到远端存储,而是针对 Kafka 的数据访问模式做了深度优化。Kafka 的读写特点非常鲜明:写入是顺序追加,读取是顺序消费(或者按 offset 随机定位)。AutoMQ 对这种访问模式重新设计了存储引擎,把顺序写放大效应降到最低,同时利用本地缓存来兜底热数据的读取性能。
从工程角度看,存算分离真正带来的价值是:计算节点变得无状态了。节点挂了,不需要从其他节点重新拉数据,只要重新挂载云盘就能恢复;分区可以秒级迁移,因为不需要搬数据,只需要改挂载关系和元数据。这个变化直接解锁了之前 Kafka 在弹性、故障恢复上的各种限制。
2.2 协议兼容是“换引擎不换驾驶室”的关键
做技术选型的时候,我们定了三条硬性标准:第一,客户端协议必须兼容 Kafka;第二,现有的 Flink、Spark、Logstash 等生态组件必须零改造接入;第三,迁移过程中业务方不能感知到底层变化。
AutoMQ 在这三条上做得非常彻底。它对外提供的协议跟 Kafka 完全一致,Producer 和 Consumer 的 API 不用改一行代码。我们在灰度验证阶段,直接拿一套生产环境用的客户端配置连到 AutoMQ 集群,结果消息生产和消费表现完全正常。这种兼容性带来的迁移成本降低是巨大的——如果每个业务方都要改客户端代码,这个项目可能撑不到上线就夭折了。
还有一点值得肯定的是,AutoMQ 在兼容性上不是“表面的兼容”。它不仅支持基础的 Topic 增删改查、分区生产消费,还支持 Kafka 的事务、幂等 Producer、消费者组协调等高级特性。这些特性在爱奇艺的实时链路里都在用,所以兼容性验证时我们特别谨慎,把所有用到的 Feature 都列了个清单,逐一在 AutoMQ 上做了测试。
2.3 延迟、吞吐和一致性:AutoMQ 如何用三种机制同时兜底
我和很多同行聊过,大家对存算分离的第一反应都是:“多一层存储转发,延迟会不会更高?”AutoMQ 的工程实现其实绕开了这个坑。
它的写入链路是这样设计的:客户端写入请求到达 Broker 后,Broker 先把数据写入本地的页缓存(Page Cache),同时异步批量刷到云盘。读取时,如果数据还在本地缓存里,直接走内存返回;如果缓存未命中,再从云盘加载。加上 EBS 本身支持多副本冗余,AutoMQ 可以在不牺牲一致性的前提下,把绝大多数读请求在 Broker 本地就处理掉。
从我们的实测数据来看,AutoMQ 在 P99 延迟上跟同规格的 Kafka 集群基本持平,部分场景甚至还略低。原因不难理解:Kafka 的延迟瓶颈往往出现在磁盘 I/O 和网络传输上,而 AutoMQ 用更大的缓存空间和更高效的刷盘策略,把这两个瓶颈同时缓解了。吞吐方面,由于 Broker 不需要做数据副本的网络传输,单节点的有效吞吐反而更高。
3. 从 Kafka 到 AutoMQ 的演进路线图:如何做到业务无感
3.1 先做评估和静态扫描,再谈迁移
任何架构演进的第一步都不是动手迁移,而是摸清家底。我们对整个 Kafka 集群做了两轮梳理:
第一轮是拓扑扫描。把当前集群里的 Topic 数量、分区数、副本数、数据保留策略、每日写入量、消费方数量全部拉出来,按照“核心链路”和“非核心链路”打标。这个过程很枯燥,但非常必要。爱奇艺的业务庞杂,有时候一个 Topic 会被五六条链路共用,如果迁移时漏掉一个消费方,就可能造成数据断流。
第二轮是客户端画像。我们需要知道每个业务方用的 Kafka 客户端版本、连接方式、是否用了事务、是否依赖旧版 Consumer API。这些信息决定了 AutoMQ 集群需要开启哪些兼容开关。比如有些老项目还在用 Kafka 0.10 版本的客户端,虽然理论上 AutoMQ 的协议兼容层能处理,但我们建议这些业务方先升级客户端版本再做迁移,避免在迁移过程中引入“兼容性黑盒”。
3.2 影子流量与灰度 Topic:用真实流量验证新集群
评估做完之后,我们进入了一个非常关键的阶段:影子验证。核心原则是——
先让 AutoMQ 集群吸收真实的生产流量,但不让下游消费方切过去,用真实数据验证新集群的稳定性和性能。
具体做法是,在 Kafka 集群和 AutoMQ 集群之间架一条分发链路,把需要的 Topic 流量复制一份到 AutoMQ 上,然后让 AutoMQ 的消费者组正常运行,把消息写到测试环境或专门的影子表里。这样跑了一周,重点观察三件事:新集群有没有消息丢失、消费延迟有没有波动、长时间运行后 Broker 节点的内存和磁盘表现是否稳定。
灰度 Topic 的步骤则是选择几个流量适中、业务容忍度较高的 Topic,先把它们的生产和消费切到 AutoMQ。灰度期间不一次性把全部消费者切过去,而是让一部分消费任务跑在新集群上,另一部分还在老集群上,两边数据做双跑比对。确认无误后,再逐步扩大切换范围。
3.3 迁移执行顺序:从“读”到“写”,从粗粒度到精确回滚窗口
真正执行迁移的时候,我们总结了一套顺序,这部分我觉得是全文最值得抄作业的:
- 先迁消费,再迁生产。先把消费端切到 AutoMQ,让 AutoMQ 的消费者组去消费 Kafka 里的老数据。这样即使 AutoMQ 集群有问题,影响范围也只在消费侧,不会污染新写入的数据。
- 生产端采用双写方案。在迁移窗口内,业务方同时向 Kafka 和 AutoMQ 写入数据,两边各自消费。稳定运行一段时间后,关闭 Kafka 写入通道,完成切换。为什么要双写?因为双写给了我们一个天然的回滚开关——如果 AutoMQ 侧出现问题,随时可以切回 Kafka,数据链路不中断。
- 回滚窗口不要拍脑袋定。我们结合了业务的消费延迟要求和数据保留周期,把回滚窗口定为 24 小时。也就是说,双写环境维持 24 小时后才关停 Kafka 写入。这个窗口期内运维团队 7x24 待命,随时准备一键切回。
这套流程看起来保守,但在爱奇艺这种体量下,保守就是最大的效率。流数据链路一旦断了,影响的不是单个业务方,而是实时数仓里的一整串依赖任务。
4. 迁移后真实的收益:成本、延迟、运维三个维度复盘
4.1 成本账:计算和存储不再互相拖累
先算账。爱奇艺的 Kafka 集群在高峰期的节点规模是相当可观的,每个节点都是 CPU、内存、磁盘“捆绑采购”。迁到 AutoMQ 之后,存储和计算可以独立扩容,这个变化直接反映在成本上。
我们的实际对比数据是:同样的流量规模,AutoMQ 下 Broker 节点数量可以减少到原来的 50% 左右。原因有两点:一是 AutoMQ 的 Broker 无状态化,不需要在节点之间做数据冗余副本传输,单节点的写入吞吐更高;二是存储下推到云盘后,不再需要预留大量的本地磁盘空间,节点规格可以往“CPU 和内存优先”的方向调。
如果只看磁盘成本,AutoMQ 的优势更明显。Kafka 的数据保留策略下,一个 Topic 有多个副本就会产生几倍的存储占用。AutoMQ 利用云盘默认的多副本能力,不再需要在应用层做副本复制,存储开销大幅下降。我们整体测算下来,在资源成本这项,综合节省了大约 40%-50%,具体数字因业务负载特征而异,但方向上非常确定。
4.2 延迟与稳定性:峰值时段的消费延迟降下来了
爱奇艺对实时性的要求是秒级到分钟级。之前用 Kafka 的时候,平峰时段消费延迟表现很好,但一到峰值时段,消费组 Lag 就会出现明显爬升。特别是几个超大 Topic,分区数上万个,重平衡一次就能让消费延迟飙到几分钟。
切到 AutoMQ 后,峰值时段的消费延迟曲线明显平滑了。一方面是因为 AutoMQ 的分区迁移速度快,集群扩容时不需要长时间的数据搬迁,业务 Pod 扩容后能立刻开始消费;另一方面是 AutoMQ 对消费者的协调机制做了优化,减少了重平衡的频率和影响范围。
得益于此,之前为了保证峰值时段消费不落后而预留的资源 buffer 可以拆掉了,实时任务的资源利用率也上了一个台阶。
4.3 运维体验:从“救火队员”到“旁观者”
这个变化虽然不好量化,但团队成员的体感最深刻。以前 Kafka 集群的运维动作基本都集中在“救火”上:磁盘告警、分区不平衡、Broker 宕机恢复、慢副本追赶……每件事都需要人工介入,而且处理时都像在做外科手术,稍有不慎就影响线上链路。
AutoMQ 的运维模型把这些操作大幅简化了。节点无状态化之后,故障恢复的流程从“数据搬迁”变成了“重新挂载”,时间从小时级缩短到分钟级甚至秒级。我们在内部演练中模拟过 Broker 节点宕机的场景,AutoMQ 集群的恢复动作几乎是自动完成的,消费者端几乎没有感知到异常。
另外,AutoMQ 的容器化适配做得比传统 Kafka 好很多。我们可以像管理普通无状态服务一样,对 Broker 节点做滚动升级、弹性伸缩,这在 Kafka 时代是不敢想象的。
5. 这套演进方案的普适性:适合哪些团队,不适合哪些团队
5.1 可以复制迁移路径,但不能复制“决策时点”
最近很多同行看到 AutoMQ 的消息,都在问“我们要不要也迁”。我的建议是:先别急着动,先对照一下自己的现状。
适合迁移的团队,一般有几个特征:集群规模已经大到扩容成本明显、业务流量有明显的波峰波谷、Kafka 运维投入持续走高、底层基础设施已经搬到云上。这类团队迁移 AutoMQ 的收益是确定性的,值得认真评估。
不适合迁移的团队也有共同点:集群规模不大(比如几十个 Broker 以内)、运维人手充足但业务迭代压力不大、基础设施还是自建机房为主。这种场景下,Kafka 依然是可靠且成熟的选择,迁移并不能带来显著的收益增量,反而要承担迁移过程中的实施风险。
还有一个关键因素叫“决策时点”。如果你们的 Kafka 集群刚刚完成一轮大版本升级,或者底层硬件刚刚做过一轮汰换,那现在可能不是迁移的好时机。先把眼前的稳定性稳住,等下一次集群扩容或技术债务集中爆发的时点,再顺势推进架构演进,节奏会顺很多。
5.2 迁移后的回望:几个容易被忽略的坑与后续扩展方向
作为一个完整走过迁移流程的团队,最后分享几个我们的私人教训:
第一,不要高估协议兼容性的“物理边界”。 兼容性指的是 API 层面,但你自己的业务代码里可能会写一些“利用 Kafka 特性”的取巧逻辑,比如通过消费特定分区来保证有序处理、利用 offset 做一些状态记录、依赖消息 key 的路由策略这些。迁移前,这些代码都需要重新审查。
第二,测试环境跑得再稳,也要做好生产环境的“应急预案”。 我们在双写阶段制定了非常完整的回滚手册,把回滚步骤细化到每条命令、每个负责人。虽然最终没有触发回滚,但这份预案给了所有人底气。
第三,关注监控指标的变化,而不是对比“看起来差不多的曲线”。 Kafka 的监控体系在社区里已经很成熟了,迁到 AutoMQ 后要重新梳理对应的监控指标。特别是消费延迟、请求耗时、流量水位这些核心指标,一定要确保告警阈值设置合理后再切流量。
至于后续的扩展方向,我们在规划两条线:一是把 AutoMQ 接入到更上层的数据湖分析链路里,利用它低存储成本的优势做更长周期的数据回溯;二是探索存算分离架构下多集群联邦的玩法,让不同业务线的流数据基础设施共享同一套存储池,进一步摊薄成本。这条路才刚起步,但方向已经很清楚了。
