2023年7月12日

Prisma 5: より高速に

Prisma 5 では、大幅な高速化を実現する変更が導入されました。これらの変更は、特にサーバーレス環境での Prisma の使用感を向上させます。これは、Prisma Client が内部で使用する、新しくより効率的な JSONベースのワイヤプロトコルのおかげです。

Prisma 5

Prisma Client の起動パフォーマンスの向上

Prisma 4.8.0 以降、Prisma のパフォーマンスと開発者体験を向上させる取り組みを強化してきました。特に、サーバーレス環境での Prisma の起動パフォーマンスの向上に焦点を当てました。

Prisma のパフォーマンスを向上させる過程で、いくつかの非効率な点を見つけ、それらに取り組みました。

パフォーマンス改善への取り組みを開始してからの変化を示すために、以下のグラフをご覧ください。

最初のグラフは、パフォーマンス改善の取り組みを開始する前の、比較的大きな Prisma スキーマ (500 モデル) を持つ AWS Lambda にデプロイされたアプリの起動パフォーマンスを表しています。

以前

次のグラフは、パフォーマンス改善の取り組み後の Prisma 5 のパフォーマンスを示しています。

以後

ご覧のとおり、Prisma の起動パフォーマンスは大幅に向上しています。次に、この大幅な改善を実現したさまざまな変更について詳しく説明します。

より効率的な JSON ベースのワイヤプロトコル

Prisma 4.11.0 より前は、Prisma は GraphQL のようなプロトコルを使用して、Prisma Client とクエリエンジン間の通信を行っていました。これには、特にサーバーレス環境でのコールドスタートにおいて、Prisma Client のパフォーマンスに影響を与えるいくつかの癖がありました。

パフォーマンス調査中に、現在の実装が、特に大規模なスキーマの場合、かなりの CPU およびメモリのオーバーヘッドを追加していることに気づきました。

この問題を軽減するためのソリューションの 1 つは、ワイヤプロトコルの完全な再設計でした。JSON を使用することで、Prisma Client とクエリエンジン間の通信を大幅に効率化することができました。この機能は、バージョン 4.11.0jsonProtocol Preview 機能フラグの背後にリリースしました。

パフォーマンス改善の取り組みを開始する前は、平均的な「コールドスタート」リクエストは次のようでした。

以前

jsonProtocol Preview 機能を有効にした後、グラフは次のようになりました。

以後

ユーザーからの多くの素晴らしいフィードバックと広範なテストの後、jsonProtocol が一般提供となり、Prisma Client が内部で使用するデフォルトのワイヤプロトコルになったことを発表できることを嬉しく思います。

詳細にご興味がある場合は、Prisma Client の起動パフォーマンスを向上させるために行った変更について詳しく説明したブログ記事「How We Sped Up Serverless Cold Starts with Prisma by 9x」をご覧ください。

より小さな JavaScript ランタイムと最適化された内部構造

プロトコルの変更に加えて、Prisma のパフォーマンスに影響を与える多くの変更も行いました。

  • 新しい JSON ベースのワイヤプロトコルがデフォルトになるにあたり、Prisma Client の依存関係を整理する機会を得ました。これには、Prisma Client の依存関係を半分に削減し、以前の GraphQL のようなプロトコル実装を削除することが含まれます。これにより、Prisma Client が使用する実行時間とメモリ量が削減されました。

  • また、クエリエンジンの内部構造も最適化しました。具体的には、クエリエンジンの起動時における Prisma スキーマの変換と、データベース接続の確立を担当する部分です。また、クエリスキーマ内の多くの型の名前の文字列を遅延生成するようになり、Prisma Client のメモリ使用量が改善され、ランタイムパフォーマンスが大幅に向上しました。

  • さらに、接続確立と Prisma スキーマ変換が、以前のように順番に実行されるのではなく、並行して実行されるようになりました

これらの 3 つの変更を行う前は、jsonProtocol Preview 機能を有効にした状態でグラフは次のようでした。

以前

これらの 3 つの変更を行った後、応答時間は3 分の 2 に削減されました。

以後

リクエストは非常に小さなフットプリントになりました。

これらの変更が Prisma Client に与える影響を拡大して比較するために、最初のグラフは JSON ベースのワイヤプロトコルの影響を示しています。

以前: JSON ベースのワイヤプロトコルの影響

次のグラフは、内部構造を最適化し、JavaScript ランタイムのサイズを縮小した後の Prisma Client のパフォーマンスを示しています。

以後: より小さな JavaScript ランタイムと最適化された内部構造の影響

Prisma 5 を試してフィードバックをお寄せください

Prisma 5.0.0 へのアップグレードをお勧めします。皆様からのフィードバックをお待ちしております!🎉

Prisma 5 はメジャーバージョンアップであり、いくつかの破壊的な変更が含まれています。影響を受けるユーザーはごく一部であると予想しています。ただし、アップグレードする前に、アプリケーションへの影響を理解するために、アップグレードガイドをご確認ください。バグが発生した場合は、issue を提出するか、既存の issue がある場合は賛成票を投じてください。

Prisma の全体的なパフォーマンスの向上にコミットしており、パフォーマンス関連の問題に対処する改善を継続的に提供していきます。最新情報を見逃さないように、Twitter でフォローしてください!

次回の投稿もお見逃しなく!

Prisma ニュースレターに登録する