https://zenn.dev/aiji42/articles/ba7767e66fb439

概要

PrismaDataProxyが遅いので、セルフホストするためのライブラリを自作して解決しました、というお話です。

本記事で作成・紹介したライブラリはOSSとして公開&npmにpublishしていますので自由にお使いください。

PrismaDataProxy とは

Prisma.ioが提供する、データベース接続管理とプーリングのためのプロキシサーバです。

Cloudflare WorkersやVecel Edge Functionなどは、データベースとのネイティブ(TCP)接続ができません。 そこでPrismaDataProxyデータベースとの接続の間に入り、WorkerからはHTTP接続でデータベースとの仮想接続を実現します。

以降、長いのでPrismaDataProxyのことをPDPと記載します。

PrismaDataProxy の弱点

PDPは https://cloud.prisma.io から、Webコンソール上でインスタンスを作成することで構築が可能です。 しかし、2022/06/19現在、選択できるリージョンは、バージニア北部とフランクフルトの2拠点のみです。

そして、サーバレスでのサービス提供となっておりコールドスタンバイによるレイテンシの影響も受けます。

PDPの利用ケースはCloudflare Workersなどのエッジサイドからのデータソース利用が大半ですが、データリクエストのレイテンシが大きいとエッジケースのメリットは薄れてしまいます。

手元の計測では、バージニア北部のインスタンスを選択し、同じリージョンにPlanetscaleを構築して接続した際に、コールドスタンバイ時では2.6s前後、コールドスタンバイなしでも600ms前後のレイテンシを観測しています。

このパフォーマンスではサービスに投入することは現実的ではありません。 しかし、Prismaの強力な型生成機能の恩恵を受けたかったため、なんとかPDPを日本リージョンにセルフホストし、更にコールドスタンバイの影響の小さいアーキテクチャで構築できないかと考えました。

Prisma Clientのコードを読む

まず、PDPのサーバソースが公開されていないかと思い探してみましたが、残念ながら公開はされていませんでした。 そこで、Prisma Client側のコードを読み、PDPとどのような通信を行っているかを見ることで、ブラックボックスなPDPの内部を解き明かせないかと考えました。