Prisma 5 引入了使速度显著提升的更改。这些更改尤其改善了在无服务器环境中使用 Prisma 的体验,这得益于 Prisma Client 在底层使用的一种新的、更高效的 基于 JSON 的线路协议。
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
预览功能后,图表看起来像这样

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

之后
现在请求留下的 footprint 非常小。
为了放大比较这些更改对 Prisma Client 的影响,第一张图表显示了基于 JSON 的线路协议的影响

之前:基于 JSON 的线路协议的影响
以下图表显示了在我们优化其内部结构并减小 JavaScript 运行时大小后,Prisma Client 的性能

之后:更小的 JavaScript 运行时和优化的内部结构的影响
试用 Prisma 5 并分享您的反馈
我们鼓励您升级到 Prisma 5.0.0,并期待听到您的反馈!🎉
Prisma 5 是一个主要版本增量,它带有一些重大更改。我们预计只有少数用户会受到这些更改的影响。但是,在升级之前,我们建议您查看我们的升级指南,以了解对您的应用程序的影响。如果您遇到任何错误,请提交问题,或者如果问题已存在,请为相应问题投票。
我们致力于提高 Prisma 的整体性能,并将继续发布解决性能相关问题的改进。请务必在 Twitter 上关注我们,以免错过任何更新!
不要错过下一篇文章!
注册 Prisma 新闻通讯