Prisma 5 引入了一些更改,使其速度显著提升。 这些更改尤其改善了在无服务器环境中使用 Prisma 的体验,这得益于 Prisma Client 在底层使用了一种新的、更高效的基于 JSON 的线路协议。
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
Preview 功能标志发布了此功能。
在我们开始任何性能改进工作之前,平均的“冷启动”请求看起来是这样的

之前
启用 jsonProtocol
Preview 功能后,图表看起来是这样的

之后
在收到用户的大量优秀反馈和经过广泛测试之后,我们很高兴地宣布 jsonProtocol
现在已正式发布,并且是 Prisma Client 在底层使用的默认线路协议。
如果您对更多细节感兴趣,我们撰写了一篇深入探讨我们为改进 Prisma Client 启动性能所做的更改的博文:《我们如何将 Prisma 的无服务器冷启动速度提高了 9 倍》。
更小的 JavaScript 运行时和优化的内部结构
除了更改我们的协议之外,我们还进行了许多影响 Prisma 性能的更改
-
随着新的基于 JSON 的线路协议成为默认协议,我们借此机会清理了 Prisma Client 的依赖项。 这包括将 Prisma Client 的依赖项减少一半,并删除以前的类似 GraphQL 的协议实现。 这减少了 Prisma Client 使用的执行时间和内存量。
-
我们还优化了查询引擎的内部结构。 具体来说,是负责在查询引擎启动时转换 Prisma schema 以及建立数据库连接的部分。 此外,我们现在延迟生成查询 schema 中许多类型名称的字符串,这提高了 Prisma Client 的内存使用率,并带来了显著的运行时性能提升。
-
此外,连接建立和 Prisma schema 转换现在并行发生,而不是像以前那样顺序运行。
在我们进行这三项更改之前,启用 jsonProtocol
Preview 功能后,图表看起来是这样的

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

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

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

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