网关是一个运行时问题
AI 网关每秒要重复数千次同一件事:接收请求、转换请求、将提供商的响应流式传回, 然后不再干预。编写网关所用的语言,决定了网关自身会占用多少延迟预算。 Go 非常契合这一特点:- Goroutine 让流式传输成本低廉。 每个到提供商的连接都是一个轻量级 goroutine, 因此长时间的流式响应不会占用线程,也不必让整个代码库都采用异步框架。
- 单个静态二进制文件。 GoModel 以单个文件发布,无需解释器、虚拟环境, 部署时也无需安装依赖树。容器镜像体积小,启动时间远低于一秒。
- 可预测的内存占用。 Go 的垃圾回收器针对低停顿时间进行了优化,而网关 为每个请求保存的状态非常少,因此在负载下内存保持平稳,而不会随 worker 数量增长。
为什么不选 Rust
Rust 能带来相同的部署形态,并且在某些路径上开销更低。但我们仍然选择了 Go, 原因与语言本身关系不大:- Go 的使用范围广得多。 在我们查阅过的所有开发者调查和语言排名中, Go 的采用率都明显领先于 Rust。部分原因在于其学习曲线更平缓:熟练使用其他语言的 工程师,几天之内就能读懂 Go 代码库并做出贡献。
- 更容易找到贡献者。 已掌握 Go 的工程师群体更大,意味着有更多人可以审查、 扩展和维护 GoModel,也让运行 GoModel 的公司在招聘相关人员时成本更合理。
- 企业已经在转向 Go。 许多在后端服务上统一使用 Java 的组织,如今将 Go 视为新基础设施的下一条标准路径。用 Go 发布网关,意味着它能契合这些团队现有的 工具链、安全审查流程和运维习惯。
- Go 仍在持续增长。 用 Go 编写的新基础设施项目占比逐年上升。押注平台团队 正在采用的语言,能让 GoModel 在长期内保持易于运行、易于贡献。
为什么不选 Python
Python 是 AI 工具的默认语言,大多数网关也是从 Python 起步的。它适合用于实验, 却不适合作为每次模型调用前都要经过的网络跳点。相关权衡在 我们的价值观中有所说明,并在基准测试 页面中进行了测量。这对您意味着什么
- 运维人员获得一个小巧、快速、静态链接的服务,在 Docker、Kubernetes 和裸机上 的行为完全一致。
- 贡献者获得一个使用自己很可能已经熟悉的语言编写的代码库,工具链标准, 无需先学习任何框架。
- 企业获得一个使用其平台团队和安全团队已经认可并支持的语言编写的网关。