Rust 终版落地:四次重写的收尾
从前年告别 WordPress、到 7 语言性能实验、到四语言选型、到功能对等性审计——这个站的重写写了四篇迭代文章,这是收尾的一篇:Rust 版已全量上线,简单交代最终形态、关键数字,和切换当天踩的三个坑。
一句话
Rust 终版已接管全部流量:内存 130 MB → 36 MB,部署物从依赖树变成 14.4 MB 单二进制,三环境跑同一份源码。最难的不是写 Rust,是证明没丢功能——以及部署原子性这类"验证门之外"的坑。
01系列回顾
告别 WordPress:用 Claude Code 重构博客(2026-04)
WordPress + 自研 C++ 服务器 → Python FastAPI + Jinja2 + MySQL,AI Coding 完成第一次统一重构。
7 种语言渲染同一个博客页——Python 到底慢不慢?(2026-06)
性能对照实验:88 RPS 的元凶是每请求重复 IO,不是 Python——"Python 慢"是伪命题。
一个网关的四语言重写:Python、Rust、C++、Go 怎么选(2026-08)
选型篇:对照各语言的工程成本与收益,Rust 胜出的理由是运维与架构,不是性能。
服务重写的功能对等性审计方法论(2026-08)
验证篇:55 条路由对照 + 前端 fetch 契约清单,抓出 30+ 个切换前人工检查不可见的缺口。
本文:终版落地
Rust 版全量上线,切换日实录与最终形态。
02终版形态
原则:存储不动、模板不动、对外契约不动,只换实现层。MySQL schema 与 SQL 直接搬,7 套模板原样迁移(minijinja,仅 1 处 dict.get() 语法适配),52 条公开行为对齐 Python 版。
| 层 | Python 版 | Rust 终版 |
|---|---|---|
| 框架 / 运行时 | FastAPI + uvicorn | axum + tokio(多核,workers=1 约束解除) |
| 模板 | Jinja2(运行时读文件) | minijinja + include_str!(编译期内嵌) |
| MySQL / 序列化 | asyncmy + Pydantic | sqlx + serde |
| 图片 / 七牛 | PIL 子进程池 / 官方 SDK | image crate / hmac 手写签名 |
| 部署物 | venv 依赖树 | 14.4 MB 单二进制 |
| 线上实测 | Python 版 | Rust 终版 |
|---|---|---|
| 进程内存 RSS | ~130 MB 常态 / 峰值 ~330 MB | 切换日 10.6 MB → 稳态 ~36 MB |
| 页面延迟(37 路由实测) | ~3 ms 量级 | 0.3 ~ 5 ms |
| 发版 / 重装 | 依赖树 + py_compile + 权限补丁 | 推源码 → 构建 ~90s → restart |
| 环境 | 三机各一套解释器环境 | prod / dev / 树莓派同一份源码各自构建 |
一个反直觉的事实:Rust 版代码不少反多(约 8,500 行 → 10,003 行 / 43 文件)——没有框架魔法,FastAPI 隐式做的事全部显式写出来,换来的是每一步都可审计。
03切换当天:三个真坑
功能缺口按 1733 的方法论修完之后,切换日还是炸了三次——每一次都在"验证门"之外。
坑一:半部署 = 模板与代码的版本错配
模板层先行部署(引用了新变量),Rust 实现层还是旧版(没有对应的处理函数)。文章容器拿不到 post-content--custom 类,主题装饰、模板默认样式、文章自定义样式三层 CSS 同时命中,用户看到"文字上盖了个奇怪的东西"。模板是编译期内嵌的,部署的最小单位是"模板 + 二进制"这个原子对,分开推就是埋雷。
坑二:对齐了语义,丢了契约
Python 版提取文章样式时正则连 <style> 标签一起返回,模板 {{ post_styles|safe }} 原样注入——包裹标签是数据的隐式契约。Rust 移植版"更干净"地只返回标签内部 CSS,裸文本漏进 <head>,浏览器不应用,文章样式全灭(用户反馈"更乱了")。修复是一行包裹 + 格式级守卫断言(starts_with("<style>"))。凡是跨层传递的字符串,包裹格式就是接口的一部分。
坑三:Windows 换行符废掉了全服务器脚本
从 Windows 工作副本直推,11 个 shell 脚本全部带 CRLF——restart.sh 直接 bash\r 报错,MySQL 每日备份脚本也被覆盖成坏版本(当天凌晨的备份成功只是因为发生在覆盖之前,次日 03:00 必然失败)。修复:全脚本转 LF + bash -n 校验 + 实跑一次备份验证。"能推上去"和"能执行"之间隔着一个 \r。
三个坑的共性
都不在功能对等性审计的射程里——审计回答"行为一致吗",而这三个全是交付形态问题:部署原子性、跨层数据格式、跨平台细节。重写工程的清单上,这三类和功能缺口同级。
04收尾核查
三坑修完后做了一轮全站路由级核查收尾:37 项实测覆盖全部页面类型 + 边界(越界分页、假分类、鉴权 401、302、gzip、ETag),prod 与树莓派双端逐项对照行为完全同构;另有 8 篇文章双版本渲染对照全部等价(3 篇仅差 1 个空格,语义零差异)。至此,四代技术栈(C++ → WordPress → Python → Rust)的最新一代落地完成。
数据出处:仓库 openspec/changes/rewrite-in-rust/(proposal/spike 数据)、rust/ 源码统计(wc -l / 路由 grep / cargo test 35+ 用例)、2026-08-19 切换日线上实测(systemctl / 37 路由扫描 / 8 篇双版本对照)。本文由 Claude Code 协作完成,属于"AI Coding 实战"系列。