我用 Rust 重写了一个 Java 微服务,然后丢了工作
我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我
一出关于“选了不合时宜的技术”的黑色喜剧。
周一我还有工牌。
周二我的工牌成了杯垫。
罪名?我把一个叫 “Billing-Quotes” 的、波澜不惊的 Java 微服务(13 个上游)用 Rust 重写了。p95 更瘦了、CPU 更冷静、内存更低,基础设施账单开始像小冰箱数字那样往下掉。然后 CTO 叫我带个箱子来。
这是一份技术正确、政治错误、文化核污染的事后剖析。
如果你也曾在凌晨两点盯着 JVM 火焰图,幻想着交付一个干净利落的 Rust 单一二进制——这就是你的带人头数的爱情喜剧。
现场:看上去“有罪”的服务
患者:Spring Boot 3.x,Java 21;双副本;每个 2 vCPU / 4 GB RAM
SLO:p95 < 120 ms;可用性四个 9(和我健身卡一样“立志”)
流量:午间尖峰——批量刷新 + 用户像“打了浓缩咖啡的啄木鸟”一样猛点 Get Quote
性能异味:JSON 瞬时高峰引发 GC 打嗝;“DTO 的 DTO”善意设计把分配量吹胀
额外阻力:一个“为一致性”而触一切的网关跳转;以及负责鉴权、指标、零食(?) 的 sidecar
不是不能跑——只是穿着羽绒服去健身。
痒点:为什么伸手去拿 Rust
三个信号在喊“上系统语言”:
高扇出 I/O:内部 gRPC + 话多的支付适配器
炙热 JSON 路径:每一次多余分配都会折返到 p99 身上
尾延迟比吞吐更重要:长尾在咬收入
我搞了个 spike:Axum、Tokio、serde、reqwest(gRPC 用 tonic)、sqlx 接 Postgres、tracing + OpenTelemetry。 镜像了每个 endpoint 与错误契约,像博物馆藏品一样保留了 header,用可灰度的 strangler 做壳,从 1% → 10% → 50% → 100% 切,不惊动 Security。
两周金丝雀,同样的流量结构:
p95:118 ms → 94 ms(稳)
p99:由刺儿变顺滑(短且少的尖 spikes)
峰值 CPU / RPS:降约 30%
稳态内存:降约 45%
基础设施账单:个位数百分比下降(不是电影桥段,但 CFO 会笑)
启动时间“眨眼即绪”,产物小巧,仪表盘无聊到刚刚好
我有图表。我有 README。我有笑容。很快,我没有工作。
那场让我“丢剧情”的评审会
开头是乐观的:
SRE:“数字很好看。”
DevOps:“二进制体量可爱。”
经理:“值班轮换能接住吗?”
安全:“威胁建模在哪儿?”
CTO:“我们对语言蔓延(language creep)的政策是什么?”
语言蔓延。我追的是毫秒;他们担的是治理——让公司可预测的安静胶水。
眉头的潜台词:
值班素养:我们的 Playbook 是 JVM 型:JFR、heap dump、熟悉的告警。Rust 需要新肌肉。
招聘与覆盖:凌晨三点,谁能安全下手?我们的板凳深度在 Java。
安全流水线:SBOM、SAST、许可证校验——全为 JVM 调了味。Rust 很棒,我们的链路没准备好。
平台一致性:千百个局部胜利,扛不住一个组织级异类。
变更周期:我们削了延迟,却加了几周的跨团队工作。
我的技术胜利,成了社会性退步。我把尾巴收好了,却把地图炸了。
四个把“升职”写成“离场”的错误
1) 优化了错误的 KPI
死盯 p95,领导层在乎交付速度与人员跨服务机动性。我的图没动他们的图。
2) 低估了“平均解释时间”
复盘靠共享语言与共享工具。我在一句话中途,引入了新方言。
3) 把工具链债务当“以后再说”
工程师把 toil 当谜题;组织把 toil 当风险。我的谜题,是他们的呼叫器。
4) 把“更快更省更稳”误以为“更可预测”
用新语言重写一个服务,是穿着“局部重构”的外衣在宣布一项战略。
Rust 到底改变了什么(和没改变什么)
真的改变了:
堆内戏码 → 所有权清晰:炙热的 JSON 路径不再像肥皂剧一样分配。
尾延迟:更少的 GC 方差;更少“p99 在尖叫”的时刻。
启动与空转足迹:冷启动与scale-to-zero 的游戏更轻松。
没改变(抱歉):
数据库:如果你的瓶颈是 Java 里的 Postgres,换 Rust 后它还是 Postgres——只是生命周期干净了。
跨团队牵引:新栈 → 新工具 → 新人要训练。
功能上线速度:如果是产品逻辑占大头,语言速度不等于出货速度。
好笑的部分
财务刚发来账单变好的喜讯,安全就问谁批准了新 SBOM 流水线。 PM 问这会不会影响 Q4 促销。 SRE 问 eBPF 闹脾气时怎么 on-box 调试。 CTO 问还有多少服务会“受益于 Rust”。
实话实说:“大概一把手,五个以内。” 他点头:“我爱工艺,我不爱先例。”
事实证明:先例的分量,比二进制还重。 周五,我的工牌滴——红了。
更好的路线图(我本该这么干)
如果你对 Rust 手痒(有时值得),请按这套无聊但正确的顺序来:
申请一条“运行时例外”通道一页纸、一个季度、一个服务。准入标准:量化 SLO 痛点、可隔离的热路径、成熟库、可回滚计划、以及达不到就日落的条款。
先上 sidecar,不要重写把一个热路径(序列化、加密、图像处理)剥离成同机 Rust sidecar,Java 仍是老大。同仪表盘测尾部改善。
让平台团队拥有工具链争取小额立项:SBOM、SAST、签名、追踪规范、崩溃捕获、仪表盘。平台点了头,你是公民,不是游击。
把可观测性当“契约”写代码前,先锁定日志格式、Trace ID、错误分类、仪表盘。“看起来一样,跑得更好”才是容易过会的叙事。
Strangler + 业务级开关从一个 endpoint起步。用开关或 Envoy 路由前滚/回滚。回滚要以分钟计,而不是开会计。
Day 1 就发布“删除计划”能删是实验的灵魂。出生证明上就写上讣告草稿。
没行话的复盘
What Went Well(做得好)
金丝雀干净、度量清晰、可逆切换
真实可复现的尾部改善
文档解释形态而不仅是语法
What Went Badly(做坏了)
性能压过了可预测性
未融资的工具与培训债
把治理当作“别人的 Jira”
Next Time(下次要这样)
先 sidecar,后重写(也许永不)
平台拥有安全与 SBOM 后再落代码
先要政策,不要在 PR 里偷带战略
一个袖珍 Go/No-Go 清单(拿走就用)
SLO 痛点已量化且业务可见
热路径可被开关隔离
平台已买入:SBOM / SAST / 签名 / 追踪
值班素养:至少 4 人能在凌晨三点安全排障
分钟级回滚
删除计划已批准
把它贴在键盘边。对不齐就先去调 GC、修 N+1,把英雄披风留到万圣节。
盒子、车站、尾声
HR 很温柔;安全很高效。我坐上公交——讽刺轻装上阵。 路上,一个 Rust-first 创业公司发来消息:“看过你去年的演讲。我们在招。我们喜欢你的数字。”
不英雄的结论:我依然喜欢 Java,也依然爱 Rust。我更爱公司——因为他们给二者付钱。工具容易鼓吹;由人组成的系统很难改变。更好的工程师不是跑赢基准的人,而是在不惊动组织结构图的前提下交付改进的人。
如果你手里握着“重写冲动”,做不性感的事:写备忘录、从比自尊更小的范围开刀,数清你让值班在凌晨三点要学的新工具。 如果账算得过,我为你的尾巴喝彩;如果不,去炫耀一个更重要的图:time-to-change。
全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

最后:
更多推荐
所有评论(0)