🏊

Web+DB な業務システムも Cloudflare Workers で動かしたい!Connection pooler 比較

2023/12/25に公開

この記事は、モニクル Advent Calendar 2023 の10日目の記事です。

はじめに

Cloudflare Workers から DB は普通に使えます。

https://developers.cloudflare.com/workers/tutorials/postgres/

しかしながら、Cloudflare Workers に限らず Edge な環境における DB のコネクションまわりについて、以下のことが気になります。

  • 処理の度に接続が切れるのでコネクションプールが使えない(プールしても使い回せない)
    • つまり毎回新しい接続確立のコスト(時間)が発生する
    • 新しいコネクションの作成は少なからず DB 側にも負荷がかかる
  • DB 側に Edge がスケールした分だけ素直に新しい接続が要求されてしまう
    • 新しい接続要求を制御できない => 最大接続数オーバー

この辺りも予めケアされているだろうという期待のもと D1 を DB として採用する選択肢もあります。しかしながら、D1 を趣味で使う分には良いと思いますが、最大DBサイズが2GB(課金した場合。ちなみにベータ時点なので、今後増える可能性はあるかも?)となると、タイトルにもあるとおり業務システムとしては採用できないかなーと本記事としては一旦外しています。そもそも、D1 はそういう用途のためのプロダクトではないという予感はしつつも、最大データサイズが増えれば夢でもないかなとちょっと期待しています。

とはいえ、Cloudflare の Edge ロケーションに分散された SQLite というのはやはり夢があるので、個人的には引き続きチェックしていきたいと思っております!

それでは、話を戻して Connection pooler(コネクションプーラー)について検討していきたいと思います。

Connection pooler(コネクションプーラー)

Edge 環境におけるコネクションプーリングどうすんのよ?というこのような課題を解決するため、Connection pooler(コネクションプーラー)という、その名のとおりコネクションプーリングのためのソリューションがいくつか存在します。

最近興味を持って調べ始めた自分の観測範囲なので漏れているものがあれば教えていただきたいです!

Cloudflare Workers + Hyperdrive

Hyperdrive は、Workers と DB の間に存在し、コネクションプールの管理を行ってくれます。

対応 DB は PostgreSQL とその互換性のある製品のみということで現時点では以下のとおりです。MySQL は Comming soon になっていますね。

Hyperdrive 自体は何かのライブラリ等に依存せず、Hyperdrive への接続文字列を提供してくれるので、アプリケーション側は DB へ直接アクセスする接続文字列から、Hyperdrive にアクセスする接続文字列に切り替えるだけで Hyperdrive を使うことができます。

なので、クライアントライブラリに制限がなく、例えば node-postgres pg パッケージで普通に動きますし、 pg パッケージを内部で使っている Drizzle でも Kysely でも Hyperdrive を使うことができるのです!

この 接続文字列を切り替えるだけですぐに使える 特定のクライアントライブラリに依存していない が Hyperdrive の特徴の中でも著者が 🆒 だと感じた点です。というのも、後述する Prisma Accelerate は Prisma 専用の Connection pooler なので思いっきりロックインしてくるんですよね。ディスってる訳ではないですよ(念のため🙏)。

しかもしかも、Hyperdrive は Workers の Paid plan でないと使えないのですが、Hyperdrive の Connection pooling 部分については無料なのです!クエリーキャッシュについて説明をスキップしましたがクエリーキャッシュの機能についてだけ有料になる予定のようです。

Hyperdrive has two primary components:

Connection pooling (always free).
Query caching and analytics (pricing coming soon).

https://developers.cloudflare.com/hyperdrive/platform/pricing/

Cloudflare Workers + Prisma Accelerate

対抗馬になるかは分かりませんが、現時点で「Cloudflare Workers でも Prisma を使いたい!」時に必須になってしまっている Prisma Accelerate についても触れておきたいと思います。

とりあえず試してみたい方はこちらをどうぞ。

https://www.prisma.io/docs/orm/prisma-client/deployment/edge/deploy-to-cloudflare-workers

Prisma Accelerate は Hyperdrive とほぼ同様に、コネクションプールの管理とクエリーキャッシュを提供してくれます。また、接続文字列を Prisma Accelerate 用の接続文字列に切り替えるだけで使えるようになる点も同じです。違うのは Prisma に依存するということですね(そもそも Prisma を使いたい人向けの製品なので、そこは依存しても良いだろうとは思います)。

もう1つ抑えておきたいのは、この Prisma Accelerate が、サイズが大きいことで有名な Prisma engines を担うことで Prisma Client のバンドルサイズを小さくでき、Workers でも Prisma が使えるようになったという点です。なので、Workers で Prisma を使う際にこの Prisma Accelerate が必須ということになってしまっています。

The generated Client has a smaller bundle size and is optimized for edge environments like Cloudflare Workers.

The smaller bundle size is due to the fact that the interfaces talking to the database (the Prisma engines) are no longer bundled with Prisma Client as this logic is now handled by Prisma Accelerate.

気になるお値段は

https://www.prisma.io/pricing

月間6万クエリーまで無料。6万クエリーを越えた分は、100万クエリーごとに$18(上位の有料プランになるとこの部分がお得になります)だそうです。詳細は上記のリンク先をご確認ください。

趣味で月間6万クエリー(1日あたり2千クエリー)越え...ますかね...仕事だったら100万クエリーごとに$18ならどうだろう...まぁ想定するアクセス数によりますね!

PgBouncer

これまで紹介したものはマネージドなサービスでしたが、自前で PgBouncer を立てるのもありかもしれません。著者は PgBouncer の存在は知っていたものの構築したり運用した経験がないので近々触ってみたいなと思っています。でも自前で運用するのは面倒そうだなという気はしています...。

Supabase には標準装備されているので Connection string の少し下にある Connection Pooling の Connection string を使うように切り替えるだけなので超簡単ですね。たしかに、URI をよく見るとドメインに pooler というサブドメインが入っています。

まとめ

それぞれをまとめるとこんな感じでしょうか。

Cloudflare Hyperdrive Prisma Accelerate PgBouncer
クライアントライブラリ pg, Drizzle, Kysely Prisma 何でもOK
価格 Workers Paid plan であれば Hyperdrive は無料 月間6万クエリーまで無料 Supabase なら標準装備、自前で立てるならサーバー代

こんなフローチャートで選ぶこともできるかもしれません。

  • Workers でも Prisma が使いたい!
    • Prisma Accelerate 必須
  • Drizzle や Kysely で OK
    • DB はどこに?
      • Supabase
        • Supabase 標準装備の PgBouncer を有り難く使う
      • AWS, Google Cloud など
        • Hyperdrive を有り難く使う(コネクションプールの機能は無料なので)
        • あえて PgBouncer を立てて自前で管理する
          • 大変そうだけど選択肢としてはある

今回はリサーチどまりなので今後それぞれ触ってみて、より理解を深めていきたいと思っております。ちなみに、個人的には Hyperdrive が一番 🆒 だと感じていて、早速 Hyperdrive だけ Get started しましたが、サクッと動いて感動でした。パフォーマンス測定もやりたいです。

いやー近い将来、Edge な環境で普通の Web+DB なシステムを Origin なしで動かしてみたいものですねー!夢です!

それでは!

株式会社モニクル

Discussion