Closed10

VercelからMySQL/PostgreSQLに接続したい場合にどういうアーキテクチャにするのが最適か

ピン留めされたアイテム
laisolaiso

Issue

  • VercelへのリクエストからServerless Functions が実行されると新規にDBに接続し、終了時にコネクションを切断する
  • 一般的なコネクションプールを使ったアーキテクチャよりDB接続コストの影響を受ける
  • Amazon RDS ProxyやCloud SQL Proxyのようなプラットフォームが提示する解決策がまだない
laisolaiso

RDSのData APIで叩く

Discussion #3684 で言及されている方法。

デメリットとしてはSQLをHTTP経由で実行する仕組みなので、任意のORMが使えるようになるわけではない

laisolaiso

EC2やGCEにインスタンスを立てて内部ネットワークにプロキシする

同じく Discussion #3684 より。

Aurora ServerlessやCloud SQL Proxyにアクセスすることを想定しているのだと思われる。PgBouncer等を使用してがんばれ。と方向性は似ている。

DB接続が単一障害点になってしまうのでサーバーレスアーキテクチャの利点が弱くなってしまうか。

laisolaiso

Vercelに金を払う

my talks with them to achieve VPC peering with our NextJS stuff it sounds like this is offered under enterprise pricing tier.

金の弾丸である

laisolaiso

Supabase

Going serverless with SQL? #5696 をチェックしたところ、Vercelの人はDigital Ocean を進めていたが supabase.io の中の人もコメントしていた。

彼等は PostgREST という仕組みをSupabase のバックエンドで提供しているようだ。

名前から想像するとData API のようにHTTP経由でクエリを送る仕組みで、通常Supabaseの提供するライブラリを利用する。

Data API と同じく既存ORMは使えないがSQL命令をこなせる、という要件なら選択肢に入るかもしれない。

追記

現在は PgBouncerが提供されている

PgBouncer is now available in Supabase

laisolaiso

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にしかロケーションもない)

laisolaiso

暫定的に結論は出ているのでクローズします

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 などがある

このスクラップは2023/01/14にクローズされました