VercelからMySQL/PostgreSQLに接続したい場合にどういうアーキテクチャにするのが最適か
Issue
- VercelへのリクエストからServerless Functions が実行されると新規にDBに接続し、終了時にコネクションを切断する
- 一般的なコネクションプールを使ったアーキテクチャよりDB接続コストの影響を受ける
- Amazon RDS ProxyやCloud SQL Proxyのようなプラットフォームが提示する解決策がまだない
PgBouncer等を使用してがんばれ
VercelやPrismaのドキュメントに書いてあること
Digital Ocean を使え
BlitzのドキュメントではDigital OceanのPostgresクラスタがホストするコネクションプールにパブリックに接続することを推奨している
EC2やGCEにインスタンスを立てて内部ネットワークにプロキシする
同じく Discussion #3684 より。
Aurora ServerlessやCloud SQL Proxyにアクセスすることを想定しているのだと思われる。PgBouncer等を使用してがんばれ。と方向性は似ている。
DB接続が単一障害点になってしまうのでサーバーレスアーキテクチャの利点が弱くなってしまうか。
Vercelに金を払う
my talks with them to achieve VPC peering with our NextJS stuff it sounds like this is offered under enterprise pricing tier.
金の弾丸である
コネクションプール実はなくていい
MySQLなら気にしなくていいよという意見ももらった
https://b.hatena.ne.jp/yayugu/20210112#bookmark-4696931061773083650
実際にどの程度パフォーマンスに問題が出そうなのかを検証する
[TBD]
Supabase
Going serverless with SQL? #5696 をチェックしたところ、Vercelの人はDigital Ocean を進めていたが supabase.io の中の人もコメントしていた。
彼等は PostgREST という仕組みをSupabase のバックエンドで提供しているようだ。
名前から想像するとData API のようにHTTP経由でクエリを送る仕組みで、通常Supabaseの提供するライブラリを利用する。
Data API と同じく既存ORMは使えないがSQL命令をこなせる、という要件なら選択肢に入るかもしれない。
追記
現在は PgBouncerが提供されている
PlanetScale
Connect any MySQL client to PlanetScale using Connection Strings
PlanetScaleの最近のアナウンスで接続数の管理をプラットフォーム側でやっているというような記述があったので試してみたところ確かにアクセスに応じてコネクションを使いまわしているような挙動になっていた。
このアップデート前までも専用ライブラリか動的にHOST URLを切り替えればできたっぽいけど固定ホストでできるようになってORMに対応できるようになって使い勝手がよくなった。
Blitzを試しに動かしてみたコード: https://github.com/laiso/db-bench
prismaもネイティブに使えてはいるんだけど、自分が試した時はCREATE DATABASEと外部キー関連のエラーが出て一部機能が使えなかった(Migrationとか)。これは既知らしくサポートするためのIssueがある
Improve support for PlanetScale · Issue #7292 · prisma/prisma
今のところVercelからMySQLクライアントで接続するのに一番使いやすそうだったがまだBetaなので商用環境には使えなさそうではある(USにしかロケーションもない)
暫定的に結論は出ているのでクローズします
A. Vecelの外にバックエンドを用意してそこでDB接続する
最も一般的な構成。チーム開発などで保守重視するコース。
VecelはSSRとBFFにとどめ外部バックエンドAPIを呼び出します。
B. コネクションプールのサポートがあるDBaaSを使う
PlanetScale https://planetscale.com/docs/concepts/planetscale-workflow や
Supabase https://supabase.com/blog/supabase-pgbouncer
PrismaなどのORMを使ってなるべくモノリシックに構築したいコース。
C. 中間にプロクシサーバーを立てる
Bでもいいが任意のDBサーバーを使いたい時に選ぶコース。接続先を自分で管理する必要があるが、サーバーレスな選択肢としてはPrisma Data Proxy https://www.prisma.io/docs/data-platform/data-proxy などがある
D. それ以外(NoSQLやコネクションプーリングなし含む)
DynamoDBやFirebase。Mongo Atlas https://www.mongodb.com/atlas/database
パブリックアクセス可能なAurora Serverless v2 https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html などがある