经过仔细评估,我们确定将我们的核心微服务迁移到 Rust将为我们提供实现这些目标的最佳机会。
为什么我们选择 Rust
说到现代后端语言,Rust 和 Go 都广受好评。然而,对于我们银行服务的高性能要求,Rust 显然是赢家。以下是我们的理由:
毫不妥协的内存安全
Rust 最突出和最知名的功能是其内存安全模型,该模型可确保在编译时消除NullPointerException和内存泄漏等常见错误。这让我们有信心,我们的微服务在生产中运行无错误,而不会出现运行时问题的不可预测性。
相比之下,Go使用垃圾收集来管理内存,这会导致服务执行期间出现周期性暂停。即使是交易处理中最轻微的延迟也会导致银行用户体验不佳。Rust 的模型可实现更流畅、不间断的性能,直接转化为更快的客户响应时间。
性能可随客户需求而扩展
Rust对系统资源的低级控制使我们能够优化微服务的性能。这对于移动和网上银行尤其重要,因为用户希望即时访问 OCTO 的MyAccount页面和详细信息、免费和快速的在线转账、电子钱包和电子货币充值以及实时通知。Rust 能够以最小的开销处理并发操作,这确保了我们的系统能够处理
增加的交易量而不会减慢速度。
Go 以其易用性和通过 goroutines 实现的有效并发模型而闻名,但 Rust 使我们对微服务性能的微调有了更多的控制权。对于像我们这样以毫秒为单位的应用程序,我们选择了 Rust 的精确性来确保我们的服务无论规模如何都能保持快速。
以客户为先的安全
作为一家受到严格监管的组织的一部分,安全性是不容商榷的。我们构建的每个功能都以客户安全为设计理念,而 Rust 的严格安全保障与这一理念完美契合。Rust 通过在代码运行之前捕获潜在的安全漏洞(如竞争条件和缓冲区溢出),将生产中可利用错误的风险降至最低。
虽然 Go 也能提供安全性,但 Rust 更注重编译时保证,这让我们安心构建安全可靠的微服务,保护敏感的客户数据。对于我们的团队来说,Rust 的安全第一方法是我们致力于提供安全银行服务的自然延伸。
我们的迁移之旅:为客户提供无缝过渡
迁移我们的核心微服务并非易事,尤其是在客户影响是首要任务的情况下。我们知道任何停机或中断都可能影响用户对我们的信任。因此,我们精心规划了迁移,以确保对客户服务零中断。
分阶段推出以实现零停机时间
我们并没有突然切换,而是采取了分阶段推出的策略,将 Rust 微服务与现有的 Java 微服务并行部署。这种方法使我们能够密切监控实际条件下的性能,确保新服务不仅速度更快,而且在高负载下更具弹性。
以客户为中心的测试
在准备全面迁移的过程中,我们的工程团队进行了广泛的测试,旨在复制实际的客户行为——例如在发薪日高峰时段转账或同时检查多个账户的余额。新的 Rust 服务出色地通过了每一项测试,实现了我们期望的改进,同时又不牺牲用户所依赖的可靠性和信任度。
团队合作,共同学习和成长
从 Java 迁移到 Rust 还意味着要学习新的工具和技术。虽然我们的许多工程师都熟悉 Java,但 Rust 对一些人来说是一种较新的语言。然而,我们致力于以客户为中心,这使得学习成为我们团队文化的一部分 — 我们提供知识共享、实践培训和同伴指导,以确保每位工程师都能为迁移的成功做出贡献并加快学习过程。是的,我们承认 Rust 的学习曲线很陡峭。
成果:更快捷、更安全的银行体验
自从将微服务从 Java 迁移到 Rust 以来,性能改进是立竿见影且可衡量的:
- 启动时间更快:Rust 服务显著缩短了启动时间。我们的内部身份验证服务的启动时间从Java 服务中的约 31.9 秒缩短到Rust 服务中的不到 1 秒,速度提高了 31 倍,使我们能够快速扩展服务并更有效地处理用户需求的意外激增。
- 降低 CPU 和内存使用率:Rust 对系统资源的有效利用降低了 CPU 和内存使用率。我们的内部身份 验证服务的利用率从Java 服务的3 个核心和 3.8 GB减少到Rust 服务的0.25 个核心和 8 MB , CPU 效率降低了 12 倍,内存效率提高了 486 倍。这种优化意味着我们的服务运行更精简,帮助我们支持更广泛的用户群,同时保持较低的运营成本。
- 增强的安全性:Rust 的安全保障降低了我们系统中潜在漏洞的风险,增强了客户对我们管理其财务数据的信任。