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 模式(具有 500 个模型),这是在我们开始努力改进之前的情况

之前

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

之后

如您所见,Prisma 的启动性能有了显著的改进。现在我们将深入研究并讨论使我们达到这种大大改进状态的各种更改。

更高效的基于 JSON 的线路协议

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

在我们的性能探索中,我们注意到当前的实现增加了相当大的 CPU 和内存开销,尤其是对于较大的模式。

我们为缓解此问题而采用的解决方案之一是完全重新设计我们的线路协议。通过使用 JSON,我们能够使 Prisma Client 和查询引擎之间的通信效率显着提高。我们在 4.11.0 版本中以 jsonProtocol 预览功能标志的形式发布了此功能。

在我们开始任何性能改进工作之前,平均的“冷启动”请求如下所示

之前

启用 jsonProtocol 预览功能后,图表如下所示

之后

经过我们用户的大量出色反馈和广泛测试,我们很高兴地宣布 jsonProtocol 现在已正式发布,并且是 Prisma Client 在底层将使用的默认线路协议。

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

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

除了更改我们的协议外,我们还进行了很多影响 Prisma 性能的更改

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

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

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

在我们进行这三个更改之前,启用 jsonProtocol 预览功能后,图表如下所示

之前

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

之后

现在请求留下的占用空间非常小。

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

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

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

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

试用 Prisma 5 并分享您的反馈

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

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

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

不要错过下一篇文章!

注册 Prisma 时事通讯