单人 + GPT-4o,14 天完成 120 万行 Rust 代码!Lumen 创始人复盘从 Go 到 Rust 全量重写全过程

📅 2026/7/18 17:19:27 👁️ 阅读次数 📝 编程学习
单人 + GPT-4o,14 天完成 120 万行 Rust 代码!Lumen 创始人复盘从 Go 到 Rust 全量重写全过程

曾凭借 Go 语言极致性能优化在云原生圈出圈的开源日志引擎 Lumen,最近完成了一次让行业意外的技术转向:创始人陈航发布长文,宣布项目核心代码已全量从 Go 迁移至 Rust,而整个迁移过程仅耗时 14 天,核心开发几乎由他一人配合 GPT-4o 完成,最终生成 Rust 代码超 120 万行。
在很多人印象里,Lumen 几乎是 Go 语言高性能服务的标杆项目:从 2021 年立项起就全程基于 Go 开发,凭借低延迟、高吞吐的日志检索能力,成为不少云厂商、中大型企业的观测组件标配,单月镜像下载量超 1800 万次。创始人陈航更是 Go 社区的资深贡献者,曾多次分享 Go GC 调优、内存优化的实战经验。
这样一个深度绑定 Go 的项目,为什么突然选择全面转向 Rust?单人 + AI 又是如何在两周内完成百万行级代码迁移的?这篇复盘里藏着的不只是语言选型的思考,更是 AI 时代软件工程的新范式。
一、曾靠 Go 快速起量的项目,为何走到重写这一步
Lumen 诞生之初,Go 几乎是唯一合理的选择。
2021 年云原生观测赛道爆发,市场需要一款比 ELK 更轻、比 Prometheus 日志组件更快的存储引擎。陈航当时的判断很明确:项目要快速迭代、抢占市场,Go 的开发效率、成熟的并发模型、完善的云原生生态是最大优势。
最初的原型仅用 3 个月就上线,Go 的 goroutine、标准库、内置 GC 让团队不用在底层内存管理上耗费太多精力,能把全部精力放在日志索引、压缩算法、查询引擎这些核心逻辑上。
“如果不是 Go,我不可能一个人在半年内做出可商用的版本。” 陈航在复盘里毫不讳言 Go 对项目早期的价值。
但随着 Lumen 进入成熟期,单集群承载量从 TB 级迈向 PB 级,Go 的先天瓶颈开始越来越明显地暴露出来。
企业级客户对尾延迟的要求是 99 分位低于 5ms,但在大流量写入场景下,Go GC 的标记清扫阶段会导致写入毛刺,99 分位延迟经常从 2ms 飙升到 200ms 以上;为了缓解 GC 压力,团队引入了对象池、堆外内存、手动内存复用等大量黑科技,代码复杂度直线上升,反而衍生出内存碎片、野指针引用等新问题。
更棘手的是内存占用:同样存储 1TB 热数据,Go 版本实际内存占用是理论值的 1.8 倍,大量碎片空间无法回收,在大内存节点上甚至会触发 OOM。团队花了半年时间做 GC 调优、内存布局优化,收效却越来越边际。
“不是 Go 不够好,是我们的场景已经走到了 Go 能力的边界。” 当每月新增的 Bug 里有 40% 都和内存、GC 相关时,陈航开始认真考虑重写的可能性。
二、为什么放弃 Go,又为什么不选 C++
复盘里陈航特意强调:放弃 Go 不是否定 Go,而是项目阶段变了,核心诉求从 “快速迭代” 转向了 “极致稳定与资源效率”。
他也认真评估过 C++ 方案 —— 毕竟 Lumen 底层的压缩库、索引引擎本身就有大量 C/C++ 依赖,迁移过去生态衔接成本很低。C++ 也能做到无 GC、精准内存控制,性能上限足够高。
但 C++ 的问题恰恰是 Go 的反面:它能解决 GC 带来的稳定性问题,却会引入新的内存安全风险。
“用 C++ 相当于把我们从‘GC 调优的坑’拉到‘踩内存的坑’。” 陈航算了一笔账:团队现在每月花在内存相关问题上的精力占 30%,换成 C++ 后,内存越界、释放后使用、重复释放这类问题只会更多,不会更少。
尤其是日志引擎这种长时间运行的底层服务,一次内存泄漏就可能导致集群逐步宕机,排查成本极高。即便加上 ASAN、Valgrind 等检测工具,也只能降低概率,无法从根源杜绝。
而这正是 Rust 最核心的吸引力:它既能做到无 GC 运行时、性能接近 C++、内存完全可控,又能通过所有权模型、借用检查器在编译期拦截绝大多数内存安全问题。
相当于用编译器的强制约束,替代 “人工编码规范 + 代码审查 + 工具检测” 的组合拳,从根源上减少底层稳定性问题。
但真正让决策卡住的,是迁移成本。
Lumen 核心 Go 代码剔除注释后约 82 万行,如果靠 5 人左右的核心团队人工重写,保守估计需要 6-12 个月。这段时间里,新功能迭代、Bug 修复、客户支持都会大幅放缓,对开源项目的社区活跃度和商业落地都是巨大风险。
“如果要停更半年换语言,收益未必覆盖得了损失。”
转折点来自一次技术预研:陈航试着用 GPT-4o 把核心索引模块的 3000 行 Go 代码转成 Rust,结果发现 AI 不仅能完成语法转换,还能自动处理大部分类型映射、错误处理,甚至能主动规避一些常见的 Rust 新手坑。
他算了一笔账:如果 AI 能承接 80% 的机械转换工作,人工只负责核心逻辑校验和架构调整,迁移周期或许能压缩到 1 个月以内。
这个成本收益比,突然就变得可接受了。
三、不是一句 Prompt 重写项目:AI 工程化工作流才是核心
陈航在复盘里反复强调:千万不要以为 “让 AI 把项目转成 Rust” 是丢一句 Prompt 就能搞定的事。直接让大模型全量转换,大概率会得到一堆能编译但逻辑千疮百孔的代码。
真正可靠的迁移,是把 AI 当成大规模协作的 “数字员工”,用工程化的工作流去管控质量。
他最终选择了一次性全量直译的方案,而不是渐进式迁移。在他看来,渐进式迁移虽然风险低,但会产生大量 FFI 胶水代码,两种语言混合调用反而会引入更多性能损耗和维护成本,长期看历史包袱更重。
一次性迁移的核心原则是:第一阶段先追求 “逻辑 1:1 对齐”,不追求地道的 Rust 写法,优先保证所有测试用例通过;迁移完成后再逐步优化,把直译代码改造成符合 Rust 最佳实践的实现。
为了保障质量,陈航搭建了一套四阶段的 AI 工作流,全程用脚本自动化调度:
阶段 1:前置规范对齐
先花 1 天时间和 GPT-4o 共同输出《Go-Rust 迁移规范》,明确所有语法映射、并发模型转换、错误处理、内存管理的统一规则。
比如:
Go 的 goroutine 对应 Rust tokio 的 spawn 异步任务;
Go 的 interface 统一映射为 Rust 的 trait 对象;
Go 的 defer 按语义对应 Drop trait 或 scope guard;
所有 unsafe 块必须标注明确的安全理由,无理由的 unsafe 默认视为缺陷。
这份规范不是给人看的,是后续所有 AI 生成代码的统一标准,避免不同文件转换风格不一致。
阶段 2:批量文件转换
将 82 万行 Go 代码按模块拆分为 1200 余个源码文件,分配给 32 个并行的 GPT-4o 实例批量转换。每个实例只负责单个文件的直译,不跨文件修改依赖,避免上下文过大导致逻辑混乱。
这一步最容易出现的问题是 AI 为了通过编译,随意添加.clone()、用unwrap()跳过错误处理,甚至用大段注释掩盖逻辑不匹配。
为此陈航引入了双模型对抗评审机制:
1 个模型负责生成代码;
2 个独立的评审模型只能看到最终代码 diff,看不到生成上下文,且被强制预设 “代码一定有问题”,专门找逻辑不一致、内存安全风险、偷懒式兼容的问题。
评审出的问题会自动打回生成模型修复,三轮修复不通过则标记为人工处理。
正是这套机制,提前拦截了大量 “编译能过但逻辑不对” 的隐性缺陷,比如并发场景下的锁粒度不一致、切片边界处理差异、错误传播路径丢失等。
阶段 3:编译错误批量修复
初始代码生成后,第一轮编译跑出了近 2 万条错误,主要集中在生命周期标注、类型不匹配、模块依赖、异步函数签名上。
如果人工一条条改,工作量难以想象。陈航的做法是把错误信息按文件拆分,自动喂给 AI 实例,让它们按规范批量修复,修复后再自动编译校验,循环往复直到错误清零。
这个阶段踩了不少坑:比如 Go 的切片是引用语义,Rust 的 Vec 是所有权语义,直译后会出现大量不必要的拷贝;Go 的接口是动态分派的鸭子类型,直接转成 Rust 的泛型 trait 会出现大量生命周期冲突。
最棘手的是并发模型映射:Go 的 goroutine 调度是 M:N 模型,代码里随处可见的go func()直接转成 tokio::spawn 后,出现了大量任务泄漏、跨线程所有权问题。这些问题 AI 能解决一部分,但核心调度逻辑还是需要人工调整。
阶段 4:测试驱动的一致性校验
编译通过只是第一步,逻辑对齐才是核心。
Lumen 本身有一套与实现语言无关的测试套件,包含 12 万条单元测试、3000 余条集成测试,覆盖写入、压缩、索引、查询、故障恢复等全场景。这套测试就是迁移的 “标准答案”。
陈航把测试用例分片分给 AI,失败的用例自动抓取堆栈、喂给模型定位修复,依然沿用 “生成 + 双评审” 的机制。
整个迁移过程中,没有任何一条测试被删除或跳过 —— 这也是他判断迁移是否合格的底线。
四、14 天迁移成果:性能、内存、稳定性全面提升
从 5 月 8 日正式启动迁移,到 5 月 21 日全平台测试全绿,整个周期刚好 14 天。
根据复盘里的数据:
原始 Go 代码:82.3 万行(剔除注释空行);
生成 Rust 代码:121.7 万行,最终合并入库 102.4 万行;
总提交次数:7216 次,峰值单小时提交 512 次;
AI 资源消耗:累计消耗输入 token 78 亿、输出 token 8.3 亿,按官方 API 定价折算成本约 12.8 万美元。
如果换成熟悉代码的核心团队人工迁移,陈航预估至少需要 9 个月。
更关键的是迁移后的实际收益,Rust 版本的 Lumen v2.0 在核心指标上实现了全面超越:

除了直观的性能数据,更核心的变化是稳定性:Rust 版本彻底解决了 GC 毛刺导致的尾延迟问题,大流量下写入曲线非常平稳;依靠编译器的检查,内存安全类 Bug 的出现概率下降了 90% 以上。
目前 Lumen v2.0 已经进入内测阶段,包括多家云厂商在内的企业客户已经开始灰度试用。
五、复盘思考:真正被改变的,是软件工程的生产方式
整个复盘的结尾,陈航没有过多聊语言优劣,反而把重点放在了 AI 对研发模式的改变上。
在这次迁移里,他的角色已经不再是传统的 “程序员”:真正手写的代码不到 1%,绝大多数时间都在做三件事 —— 制定迁移规则、设计工作流、校验核心结果、处理 AI 搞不定的复杂问题。
“以前的瓶颈是写代码的速度,现在的瓶颈是定义问题、判断质量、设计流程的能力。”
在他看来,这次迁移最有启示意义的不是 “Rust 比 Go 好”,而是AI 大幅降低了大型技术重构的成本。
过去,很多团队明知技术选型有问题,也不敢轻易重构,因为人力成本、时间成本、风险成本太高。但当 AI 能承接绝大多数机械性的编码工作后,“重写” 不再是伤筋动骨的大手术,而是可以快速验证、快速落地的决策。
但这并不意味着程序员的价值降低了。恰恰相反,AI 写的代码越多,人的判断就越重要:
要不要重写、为什么重写,是人做的决策;
迁移的规则、质量的标准,是人定的;
复杂场景的架构设计、核心逻辑的校验,是人兜底的。
最后他写了一句很有分量的话:
“未来能拉开差距的,从来不是会不会用 AI 写代码,而是你能不能想清楚‘该写什么代码’。”
毕竟,AI 可以帮你在两周内写出百万行代码,但决定一个项目能走多远的,永远是技术选型的判断力、对业务场景的理解,以及对质量底线的坚守。