2023年7月12日

Prisma 5: 默认更快

Prisma 5 引入了使其显著更快的更改。这些更改尤其改善了在无服务器环境中使用 Prisma 的体验,这得益于 Prisma Client 在底层使用的一种新的、更高效的基于 JSON 的线协议

Prisma 5

改进了 Prisma Client 的启动性能

从 Prisma 4.8.0 版本开始,我们加倍努力改进 Prisma 的性能和开发者体验。特别是,我们专注于提高 Prisma 在无服务器环境中的启动性能。

在我们努力改进 Prisma 性能的过程中,我们发现并解决了一些效率低下的问题。

为了说明我们开始投入精力改进性能以来的差异,请看下面的图表。

第一张图表示在开始改进工作之前,一个部署到 AWS Lambda 并使用相对较大的 Prisma schema(包含 500 个模型)的应用的启动性能

之前

下图显示了我们进行性能改进工作后 Prisma 5 的性能

之后

正如您所见,Prisma 的启动性能有了显著提升。现在我们将深入探讨实现这一显著改进状态的各种变化。

更高效的基于 JSON 的线协议

在 Prisma 4.11.0 之前,Prisma 使用类似 GraphQL 的协议在 Prisma Client 和查询引擎之间通信。这带来了一些影响 Prisma Client 性能的怪癖,尤其是在无服务器环境的冷启动时。

在性能探索过程中,我们注意到当前的实现增加了相当大的 CPU 和内存开销,特别是对于较大的 schema。

解决此问题的一种方案是对我们的线协议进行彻底重新设计。通过使用 JSON,我们能够使 Prisma Client 和查询引擎之间的通信显著更高效。我们在版本 4.11.0 中通过 jsonProtocol 预览特性标志发布了此功能。

在我们开始任何性能改进工作之前,一次平均的“冷启动”请求看起来像这样

之前

启用 jsonProtocol 预览特性后,图表看起来像这样

之后

在收到用户大量出色反馈并进行广泛测试后,我们激动地宣布 jsonProtocol 现在已全面可用(GA),并且是 Prisma Client 在底层将默认使用的线协议。

如果您对更多细节感兴趣,我们撰写了一篇深入探讨为改进 Prisma Client 启动性能所做更改的博文:如何将 Prisma 无服务器冷启动速度提高 9 倍

更小的 JavaScript 运行时和优化的内部结构

除了更改协议之外,我们还做了许多影响 Prisma 性能的更改

  • 随着新的基于 JSON 的线协议成为默认设置,我们借此机会清理了 Prisma Client 的依赖项。这包括将 Prisma Client 的依赖项削减了一半,并移除了之前的类似 GraphQL 的协议实现。这减少了执行时间和 Prisma Client 使用的内存量。

  • 我们还优化了查询引擎的内部结构。特别是负责在查询引擎启动时转换 Prisma schema 和建立数据库连接的部分。此外,我们现在延迟生成查询 schema 中许多类型的名称字符串,这改进了 Prisma Client 的内存使用,并带来了显著的运行时性能提升。

  • 此外,连接建立和 Prisma schema 转换现在并行发生,而不是像以前那样按顺序运行。

在进行这三项更改之前,启用 jsonProtocol 预览特性后的图表看起来像这样

之前

进行这三项更改后,响应时间缩短了三分之二

之后

请求现在产生的开销非常小。

放大比较这些更改如何影响 Prisma Client,第一张图显示了基于 JSON 的线协议的影响

之前:基于 JSON 的线协议的影响

下图显示了我们优化 Prisma Client 内部结构并减小 JavaScript 运行时大小后的性能

之后:更小的 JavaScript 运行时和优化的内部结构的影响

试用 Prisma 5 并分享您的反馈

我们鼓励您升级到 Prisma 5.0.0 版本,并期待听到您的反馈!🎉

Prisma 5 是一个主要版本更新,它带来了一些破坏性更改。我们预计只有少数用户会受到这些更改的影响。然而,在升级之前,我们建议您查阅我们的升级指南,以了解对您的应用程序的影响。如果您遇到任何错误,请提交一个议题,或如果已有相应议题,请为其投票。

我们致力于提高 Prisma 的整体性能,并将继续推出解决性能相关问题的改进措施。请务必在 Twitter 上关注我们,不错过任何更新!

不要错过下一篇文章!

订阅 Prisma 新闻通讯