2023年7月12日

Prisma 5:默认更快

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

Prisma 5

Prisma Client启动性能的提升

自Prisma 4.8.0以来,我们加倍努力,以提升Prisma的性能和开发者体验。我们特别专注于改善Prisma在无服务器环境中的启动性能。

在提升Prisma性能的探索中,我们发现了一些效率低下的地方,并对其进行了处理。

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

第一张图显示的是我们开始改进之前,一个部署到AWS Lambda的应用,其Prisma schema相对较大(有500个模型)时的启动性能

Before

之前

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

After

之后

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

更高效的基于JSON的线协议

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

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

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

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

Before

之前

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

After

之后

在收到用户*大量*的宝贵反馈和进行广泛测试后,我们很高兴地宣布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预览功能后的图表是这样的

Before

之前

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

After

之后

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

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

Before: JSON-based wire protocol impact

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

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

After: Smaller JavaScript runtime and optimized internals impact

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

试用Prisma 5并分享您的反馈

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

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

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

不要错过下一篇文章!

订阅Prisma新闻邮件

© . All rights reserved.