我用 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

三个信号在喊"上系统语言":

  1. 高扇出 I/O:内部 gRPC + 话多的支付适配器

  2. 炙热 JSON 路径:每一次多余分配都会折返到 p99 身上

  3. 尾延迟比吞吐更重要:长尾在咬收入

我搞了个 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 手痒 (有时值得),请按这套无聊但正确的顺序来:

  1. 申请一条"运行时例外"通道 一页纸、一个季度、一个服务。准入标准:量化 SLO 痛点、可隔离的热路径、成熟库、可回滚计划、以及达不到就日落的条款

  2. 先上 sidecar,不要重写 把一个热路径(序列化、加密、图像处理)剥离成同机 Rust sidecar ,Java 仍是老大同仪表盘测尾部改善。

  3. 让平台团队拥有工具链 争取小额立项:SBOM、SAST、签名、追踪规范、崩溃捕获、仪表盘 。平台点了头,你是公民 ,不是游击

  4. 把可观测性当"契约" 写代码前,先锁定日志格式、Trace ID、错误分类、仪表盘 。**"看起来一样,跑得更好"**才是容易过会的叙事。

  5. Strangler + 业务级开关一个 endpoint 起步。用开关或 Envoy 路由前滚/回滚 。回滚要以分钟计 ,而不是开会计

  6. 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 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

最后:

Vue 设计模式实战指南

20个前端开发者必备的响应式布局

深入React:从基础到最佳实践完整攻略

python 技巧精讲

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

相关推荐
极客Bob几秒前
Java 集合操作完整清单(Java 8+ Stream API)
java
雨中飘荡的记忆1 分钟前
Javassist实战指南
java
uhakadotcom1 分钟前
Loguru 全面教程:常用 API 串联与实战指南
后端·面试·github
q***d1734 分钟前
Kotlin在后台服务中的框架
android·开发语言·kotlin
Knight_AL8 分钟前
JWT 无状态认证深度解析:原理、优势
java·jwt
周杰伦fans12 分钟前
C# 中的 `Hashtable`
开发语言·c#
JuiceFS12 分钟前
JuiceFS sync 原理解析与性能优化,企业级数据同步利器
运维·后端
习习.y17 分钟前
关于python中的面向对象
开发语言·python
lingggggaaaa17 分钟前
免杀对抗——C2远控篇&PowerShell&有无文件落地&C#参数调用&绕AMSI&ETW&去混淆特征
c语言·开发语言·笔记·学习·安全·microsoft·c#
技术净胜17 分钟前
MATLAB 基因表达数据处理与可视化全流程案例
开发语言·matlab