PingCAP与Cloudflare盛赞Go语言 | AI生成和翻译
无论是 PingCAP 还是 Cloudflare,都没有对使用 Go 语言表示过”遗憾”。事实上,这两家公司都曾公开称赞 Go 语言的优势,并继续在其核心产品中广泛使用它。不过他们在语言选择上也秉持务实态度,会在特定场景下选用更合适的编程语言。
具体情况如下:
PingCAP(TiDB)与 Go 语言
- 并无遗憾:PingCAP 选择使用 Go 语言开发 TiDB 的 SQL 层(
tidb-server),是看中其卓越的并发模型(goroutine 和 channel)、开发便捷性以及强大的标准库。这些特性帮助他们相对快速地构建出复杂的分布式数据库。 - 正视挑战:虽然 Go 语言是 TiDB 的核心,但 PingCAP 对其挑战保持高度透明,特别是 Go 语言的垃圾回收机制。他们的技术文档和博客经常探讨:
- GC 停顿:他们承认即使短暂的 GC 停顿也会给高性能数据库带来延迟抖动,并通过调优
GOGC参数、设置GOMEMLIMIT以及实现自适应 GC 触发机制来积极缓解这个问题 - 内存管理:他们提供了详细的内存监控指南和 OOM 问题排查方案,认识到 Go 语言中低效的内存模式可能引发问题
- GC 停顿:他们承认即使短暂的 GC 停顿也会给高性能数据库带来延迟抖动,并通过调优
- Rust 的战略性应用:PingCAP 选择使用 Rust 开发其分布式键值存储引擎 TiKV。这并非对 Go 的”后悔”,而是针对存储层的战略决策——该层对极致低延迟、可预测性能和精细化内存控制有着极高要求
- Rust 的所有权系统和借用检查机制,以及无垃圾回收器的特性,非常适合这种每微秒每字节都至关重要的系统级编程场景
- 他们认识到,对于关键存储引擎而言,Rust 较高的学习门槛和较慢的编译速度是可接受的代价,但对于快速迭代的 SQL 层则不太理想
- PingCAP 的结论:他们明确将 Go 和 Rust 视为互补工具——Go 用于高层业务逻辑和快速迭代,Rust 用于底层性能关键组件
Cloudflare 与 Go 语言
- 广泛采用:Cloudflare 是 Go 语言的早期热情采用者,其 DNS 基础设施、SSL 处理、负载测试工具及众多内部系统都广泛使用 Go。他们始终积极评价 Go 在并发处理、部署便捷性和开发效率方面的优势
- 技术演进而非遗憾:Cloudflare 确实实现了语言多样化,特别是在关键领域转向使用 Rust,但这源于对性能、安全和资源效率的追求,而非对 Go 的”后悔”
- Pingora(Rust):典型例证是 Cloudflare 用 Rust 重写的 Pingora 代理系统,用于替代原有基于 C 语言的 Nginx 基础设施。这次技术转型主要基于:
- 内存安全:Rust 能防范 C/C++ 中常见的内存错误(如缓冲区溢出、悬垂指针),极大提升系统安全性和稳定性
- 极致性能:对于处理万亿级请求的核心组件,Rust 的”零成本抽象”和精细化控制可实现比 Go(受 GC 开销影响)更高的性能与更低的资源消耗
- 更优的系统编程体验:虽然 Rust 学习曲线陡峭,但对于开发底层网络组件的系统工程师而言,其严谨性和强大类型系统最终能产出更健壮、更易维护的代码
- Go 仍占重要地位:即使推出 Pingora,Cloudflare 仍继续使用 Go 开发和维护大量服务。他们认为 Go 对多数工作负载”足够快速”,并看重其开发速度和运维简便性
- Pingora(Rust):典型例证是 Cloudflare 用 Rust 重写的 Pingora 代理系统,用于替代原有基于 C 语言的 Nginx 基础设施。这次技术转型主要基于:
- Cloudflare 的结论:该公司奉行多语言策略,坚持为不同场景选择最合适的工具。Go 仍是其基础性语言,特别适合需要快速开发和并发处理的业务场景;而 Rust 则越来越多地用于对性能极限、内存安全和精细化控制有严苛要求的系统级组件
本质上,这两家公司都是深谙编程语言权衡之道的成熟技术团队。他们并非对选择 Go 表示”遗憾”,而是通过实践演示了如何务实运用 Rust 等语言,在特定问题域充分发挥其无 GC、内存安全等特性,为关键基础设施带来显著优势。