Go 让我变快。Rust 让我更用心。AWS 让我付费。
Source: Dev.to
请提供您希望翻译的完整文本内容,我会按照要求将其译成简体中文并保留原有的 Markdown 格式、代码块和链接。
舒适阶段:当 Go + AWS 像超能力一样
Go 在让一切看起来井然有序方面异常出色。
- 编写服务 – 编译瞬间完成。
- 部署 – 干净地上线。
- 运行 – 永久存活。
这门语言为你提供:
- 简单的并发模型
- 强大的标准库
- 可预测的构建过程
- 小巧的静态二进制文件
AWS 为你提供:
- 理论上无限的容量
- 全面托管
- 自动伸缩
- 只有在已经为时已晚时才会触发的告警
二者结合,产生了强大的幻觉:
“这个系统高效,因为它很简单。”
在早期,这种幻觉大多是成立的。
为什么 Go 主宰云后端(理所当然)
1. 开发者吞吐量为王
Go 减少了决策疲劳:
- 单一的格式化风格
- 单一的依赖管理系统
- 单一的并发实现方式
- 单一显而易见的部署产物
你不需要为架构争论数周。直接交付。
在云环境中,投入生产的时间往往比微观优化更重要。
2. 冷启动友好
与基于 JVM 的技术栈相比,Go 二进制文件:
- 启动迅速
- 加载的运行时状态极少
- 与 Lambda 和容器自动伸缩配合良好
仅此一点就让 Go 成为 AWS 的宠儿。
3. 运营可预测性
大多数 Go 服务的故障方式都很“乏味”:
- Panic 明显
- 内存使用基本稳定
- 性能下降是渐进的
这让值班轮转变得可以承受。
所以——Go 当之无愧。
缓慢燃烧:当“够好”开始计费时
关于云系统,有一点要说明:
它们不会立刻惩罚低效。
相反,它们会悄悄地进行:
- +10 % CPU 这里
- +200 MB 内存 那里
- 再加一个实例 “以防万一”
- 更大的任务规模 因为“更安全”
没有任何单一决定是离谱的。
但它们合在一起会产生叠加效应。
你的 AWS 账单不会突然飙升。
它会悄然上升。
而这种悄悄增长的费用最难对抗——因为没有明显的故障。
垃圾回收:你未曾注意的税收
Go 的垃圾回收器是它最伟大的成就之一。
它也是它最大的云端负担之一。
现代 Go GC 具备:
- 低延迟
- 并发
- 为大多数工作负载进行了良好调优
但“良好调优”并不意味着免费。
GC 在 AWS 上实际花费的代价
- 为避免内存压力而预留的额外内存空间
- 标记‑清除过程中的 CPU 周期
- 负载下不可预测的延迟
- 较低的容器密度
单独来看,这些都还好。
规模化后,它们就成了基础设施策略。
你不会直接注意到 GC。
你会在以下情况下注意到它:
- 为了保险而把任务内存调高
- 为了避免更紧凑的实例打包
- 提前进行水平扩展
AWS 并不关心你为何需要更多资源。
它只会计费。
当 Rust 进入视野(并非自愿)
我并没有某天醒来时想:
“我应该为了好玩把它重写成 Rust。”
Rust 出现于 Go 不再那么轻易被忽视的时候。
特定的工作负载迫使我们考虑:
- 高吞吐量摄取服务
- 流式管道
- 实时数据处理
- 每秒执行数百万操作的热点路径
这些并不是业务逻辑密集型服务。
它们是 物理计算密集 的服务。
Rust 并非默认更快(那是谎言)
让我们立刻粉碎一个神话:
Rust 并不会神奇地让你的系统变快。
它所做的,是 消除借口。
Rust 强迫你面对:
- 分配模式
- 所有权边界
- 内存布局
- 缓存行为
- 线程通信
在 Go 中,你可以长时间忽视这些东西。
在 Rust 中,你做不到。
这就是重点。
第一个 Rust 服务很糟糕
说实话。
我的第一个 Rust 微服务:
- 编写时间 是原来的 3 倍
- 编译错误比实际代码还多
- 让我开始怀疑自己的生活选择
但一旦它跑起来……就出现了奇怪的现象。
指标很无聊
- 内存使用保持平稳
- 延迟稳定
- CPU 正好在预期范围内
- 负载下没有任何意外
这个服务的表现就像一个实体对象。
可预测、可衡量、诚实。
Rust 改变你设计云系统的方式
Rust 不仅改变代码。
它改变架构。
1. 你停止“以防万一”而过度分配
因为分配是显式的,你可以:
- 复用缓冲区
- 流式处理数据
- 以生命周期而非堆来思考
这直接降低了内存占用。
2. 你为数据流而非便利性进行设计
Rust 引导你走向:
- 明确的所有权边界
- 默认不可变的数据
- 显式的变更点
这导致并发的思维模型更简洁。
3. 你先垂直扩展再水平扩展
当服务高效时,你可以:
- 在每个实例上打包更多工作负载
- 延迟自动扩展
- 减少跨服务通信
AWS 的定价偏爱垂直效率。
AWS视角:语言选择如何影响账单
EC2
- Rust 服务在 更小的实例类型 上运行舒适
- Go 服务需要 更多的内存余量
- 缓存效率比原始 CPU 核心更重要
ECS / EKS
- 使用 Rust 时容器密度更高
- OOM(内存不足)被杀的情况更少
- 自动扩缩行为更可预测
Lambda
- Rust 冷启动始终保持低水平
- 内存‑性能比更佳
- 对 CPU 密集型函数成本更低
这些在单纯的基准测试中并未体现。
它们体现在 每月账单 中。
混合现实:别把它框定为 Go vs Rust
这不是语言之争。
它是一个 资源分配问题。
你选择运行的方式以及编写方式,直接影响:
- 基础设施支出
- 运维复杂度
- 团队速度
了解隐藏成本——GC 开销、内存填充、过度配置——可以让你在继续使用 Go、迁移到 Rust,或采用混合方案时做出明智的权衡。
底线:
如果你今天的云费用看起来“合理”,请深入挖掘。
那些安静、逐步累积的低效才是最终把“合理”支出变成惊人费用的根源。
Go 仍然完美适用于
- API
- 控制平面
- 管理服务
- 粘合代码
- 原型开发
- 业务逻辑
Rust 的优势在于
- 数据管道
- 高吞吐服务
- 对延迟敏感的组件
- CPU 密集型工作负载
- 边缘服务
AWS 并不在乎你喜欢哪种语言,它在乎的是你使用硅片的效率。
可观测性最终会说出真相
当 Go 和 Rust 服务并肩运行时,可观测性不再是抽象的。指标让差异一目了然:
- 内存曲线
- 尾部延迟
- CPU 饱和度
- 可扩展性行为
这些系统并不是在竞争,而是揭示了权衡。
真正的教训:语言编码价值观
Go 价值观
- 简洁
- 开发速度
- 团队可扩展性
Rust 价值观
- 正确性
- 明确性
- 长期效率
AWS 价值观
- 利用率
- 可预测性
- 你不询问价格问题
选择一种语言就是在选择你想为之付费的价值观。
为什么在规模扩大时更重要
早期团队绝对应该优化速度——Go 在这方面非常出色。
但随着系统成熟:
- 利润空间收紧
- 负载增加
- 账单不再是理论上的
这时,效率不再是“过早优化”,而是基础设施卫生。
最后的思考:云是一台诚实机器
云不在乎优雅、潮流或你喜欢的语言。它衡量:
- CPU 周期
- 内存使用
- 网络流量
- 时间
…and charges you accordingly.
- Go 帮助你快速前进。
- Rust 帮助你了解成本。
- AWS 确保你学会区别。