
苹果公司已将其全球密码监控服务从 Java 迁移到 Swift,实现了吞吐量增加 40%,并显著减少了内存使用量——释放了近 50%之前分配 Kubernetes 的容量。
在最近的一篇文章中,苹果工程师详细说明了重写如何帮助服务扩展到每天数十亿次请求,同时提高了响应能力和可维护性。团队提到,较低的内存开销、更好的启动时间和简化的并发性是选择 Swift 而不是进一步优化 JVM 的关键原因。
Swift 使我们能够编写更小、更简洁、更具表现力的代码库(代码行数减少了近 85%),这些代码库在优先考虑安全性和效率的同时具有高度的可读性。
苹果的密码监控服务是更广泛的密码应用生态系统的一部分,负责安全地检查用户保存的凭据是否出现在已知的数据泄露中,而不会向苹果泄露任何私人信息。它每天处理数十亿次请求,使用隐私保护协议进行密码学比较。
这种工作负载需要高计算吞吐量、严格的延迟限制和跨区域的弹性伸缩。一天之内的流量波动很大,区域峰值差异高达 50%。为了适应这些波动,系统必须能够快速启动或关闭实例,同时保持低延迟响应。
苹果之前的 Java 实现难以满足服务不断增长的性能和可扩展性需求。垃圾收集在负载下导致不可预测的暂停时间,降低了延迟一致性。从 JVM 初始化、类加载和即时编译的启动开销,减缓了系统实时扩展的能力。此外,服务的内存占用量通常每个实例达到数十 GB,降低了基础设施效率并增加了运营成本。
Swift 最初是作为苹果平台的客户端语言开发的,后来扩展到服务器端用例。苹果的工程团队选择 Swift,不仅是因为它的生态系统一致性,还因为它能够在计算密集型环境中提供一致的性能。
这次重写还使用了Vapor(这是一个流行的 Swift Web 框架)作为基础。还实现了其他自定义包老处理椭圆曲线操作、密码学审计和特定于密码监控领域的中间件。
Swift 的确定性内存管理,基于引用计数而不是垃圾回收(GC),消除了由 GC 暂停引起的延迟峰值。事实证明,这种一致性对于大规模低延迟系统至关重要。在调优之后,苹果报告了亚毫秒级的 99.9 百分位延迟和内存使用量的大幅下降:Swift 实例消耗了数百 MB,而 Java 则消耗了数十 GB。
启动时间也得到了改善。没有 JVM 初始化开销或 JIT 预热,Swift 服务可以更快地冷启动,支持苹果的全球自动扩展需求。
苹果的迁移反映了一个更广泛的趋势:在极端规模的服务中使用面向性能的语言。从高性能的源代码控制解决方案到区块链的编程语言,Meta与 Rust 有着悠久的历史。Netflix引入了 Rend,这是一个用 Go 编写的高性能代理,来接管与 Memcached 交互的基于 Java 的客户端。AWS 在确定性性能和低资源使用提高基础设施效率的服务中越来越多地依赖Rust。
虽然这并不是 Java 和类似语言衰落的迹象,但有越来越多的证据表明,在性能需求的最高端,一些人发现通用运行时不再满足其需求。
原文链接:
评论