Prisma 5引入了使其顯著更快的更改。由於Prisma Client在底層使用了一種新的、更高效的基於JSON的線協議,這些更改特別改善了在無伺服器環境中使用Prisma的體驗。
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現已普遍可用,併成為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新聞郵件