Go 让我变快。Rust 让我更用心。AWS 让我付费。

发布: (2026年2月8日 GMT+8 01:58)
11 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本内容,我会按照要求将其译成简体中文并保留原有的 Markdown 格式、代码块和链接。

舒适阶段:当 Go + AWS 像超能力一样

Go 在让一切看起来井然有序方面异常出色。

  1. 编写服务 – 编译瞬间完成。
  2. 部署 – 干净地上线。
  3. 运行 – 永久存活。

这门语言为你提供:

  • 简单的并发模型
  • 强大的标准库
  • 可预测的构建过程
  • 小巧的静态二进制文件

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 确保你学会区别。
0 浏览
Back to Blog

相关文章

阅读更多 »

UX/UI 排版

Typography 是指什么?- 使用哪种字体 - 在什么位置多大 - 多粗 - 行间距 - …