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

📅 2026/7/18 17:13:40
单人 + 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 可以帮你在两周内写出百万行代码但决定一个项目能走多远的永远是技术选型的判断力、对业务场景的理解以及对质量底线的坚守。