🐇

2023年振返り: Cloudflare Workersとデータベース接続の進歩

2023/12/30に公開

2023年はエッジコンピューティングとデータベース接続の分野において、Cloudflare Workers(以下CFWorkers)が中心となり多くの進歩が見られました。本記事では、この1年間の重要なトピックと、それがどのように開発体験を変えたかを振り返ります。特に、CFWorkersのエコシステムの成長、機能拡張、およびDB接続の課題と解決策に焦点を当てています。

エコシステムの進化とCFWorkers上からのDB接続需要の増加

2021年頃から2022年にかけて、いくつかのWebアプリケーションのフレームワークやエコシステムが、CFWorkers上での動作やデプロイをサポートしたことがきっかけとなり、エッジランタイム・コンピューティングの注目を集めるようになりました。

Remix

Remixは、フロントエンドのフレームワークであり、エッジランタイムへのデプロイをサポートしています。
2021年末頃から、Remixは開発者コミュニティによって広く受け入れられ、特にCFWorkersとの統合によって、低遅延でリッチなインタラクティブなウェブアプリケーションを構築し、エッジにデプロイすることができるようになりました。

Astro

Astroは、パフォーマンスにフォーカスしたWebフレームワークで、特に静的サイト生成に優れています。アイランドアーキテクチャやパーシャルハイドレーションと呼ばれる技術で高速なウェブサイトの構築を支援することで注目を集めました。
安定版となった初期からCFWorkersやPagesへのデプロイをサポートしています。

GraphQL Yoga

GraphQLサーバを簡単に設定し、運用するためのライブラリです。
リゾルバをCFWorkers上で動かすことで、低遅延かつ安価にスケーラブルなGraphQLサーバを提供することが可能となります。

https://the-guild.dev/blog/graphql-yoga-worker


こういったエコシステムやフレームワークがエッジランタイムでの動作をサポートし、開発コミュニティの関心がエッジランタイムでの開発に寄ったことで、CFWorkers上からRDBなどの外部データベースへの接続需要が高まりました。

しかし、CFWorkersは当初、TCPでのダイレクト接続をサポートしておらず、またNode互換性が低かったこともあり、開発者はデータベースへの接続を行うためにさまざまな方法を探求し、それぞれのデータベースサービスが提供する独自の解決策に頼っている状態でした。

Supabase

SupabaseはPostgresSQLに対して、RESTful API経由でのアクセスを提供するモジュールであるPostgRESTを利用します。

https://postgrest.org/en/stable/

しかし、クライアントモジュールである@supabase/supabase-jsは、PrismaなどのORMライブラリと比較して型サポートが弱く、複雑なクエリを構築する際には開発体験が悪化する課題があります。

Neon

Neonは、WebSocketを使用してデータベースへのリアルタイムアクセスを提供するという画期的なアプローチを取りました。TCPではなくWebSocketを利用することで、持続的なコネクションを通じてSQL文を直に発行しての読み書きが可能です。
しかし、単発のクエリに関しては、WebSocketのコネクション確立に時間がかかるため、パフォーマンス面での課題があり、加えて、型のサポートが弱いため、Supabaseと同様に複雑なクエリやアプリケーションの開発では課題があります。

https://neon.tech/blog/http-vs-websockets-for-postgres-queries-at-the-edge

Prisma Data Proxy

Prismaは、SaaSではなく、アプリケーション開発におけるORMの役割を果たします。強力な型サポートと広範なデータベースへの対応により、多くのアプリケーションで採用されています。
Prisma Data Proxy(現在はAccelerate) は、Prismaクライアントから送信されたスキーマベースのクエリをHTTP経由で受け取り、そのクエリをデータベースに送信するプロキシサービスです。この方法で、CWorkers上でのデータベース接続が可能になります。しかし、初期のData Proxyは、サーバのロケーションが限られていることやコールドスタートの問題により、遅延が大きくなり、CFWorkersの利点を活かせない状況でした。

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

Accelerateはこれらの問題を解決していますが、最適な利用体験を得るには有料プランが必要です。

https://www.prisma.io/docs/accelerate/what-is-accelerate


これらの方法はいずれも創造的な回避策でしたが、各々が独自の制限や課題を持っている状態であり、エッジランタイムでのアプリケーション開発にブレーキを掛ける要因になっていたことは否めません。

Cloudflare Workersの機能拡張とデータベース接続の改善

2023年に入り、Cloudflareはいくつかの機能拡張を発表し、エッジコンピューティングにおけるデータベース接続のパラダイムを大きく前進させました。

Nodeの互換性向上

2023年3月、CloudflareはいくつかのNode.jsのコアAPIの互換性向上をサポートしたことを発表しました。

https://blog.cloudflare.com/workers-node-js-asynclocalstorage

この互換性の向上は、外部データベースとの接続においても間接的ながら重要な役割を果たしています。特に、PostgreSQLに接続するために広く使われるpgモジュールなど、Node.jsのエコシステム内の多くのデータベース関連モジュールが、CFWorkers上でよりスムーズに動作する土台を整えました。

TCPダイレクト接続の導入

そしてついに、2023年5月、CloudflareはTCPソケットでの接続のサポートを発表しました。

https://blog.cloudflare.com/workers-tcp-socket-api-connect-databases

これによって、外部データベースへのアクセスには特定のSaaSが提供する独自のクライアントやAPIへの依存が解消され、標準的なデータベースクライアントや広く使われているORMライブラリを直接利用できるようになりました。

DB接続の課題及び解決策

TCPでのダイレクト接続を実現したことで、CFWorkersからの外部DB利用が大きく加速しましたが、コネクションの確立と維持、地理的な距離によるレイテンシの問題など、いくつかの課題が明らかになりました。これらの課題は、特にステートレスな設計のWorkersを利用する際に顕著に現れます。

往復の発生とステートレス性
TCPとTLSでのDB接続には、コネクションを確立するためにネットワーク上での往復が発生します。一般的なステートフルなサーバであれば、一度DBとのコネクションを確立してしまえば、以降のリクエストに関してはコネクションの再利用ができるので高速にクエリを解決することができます。
しかし、CFWorkersはステートレスな設計であり、リクエスト間でコネクションを再利用することができず、パフォーマンスと効率性に影響を与えます。

地理的な距離とラウンドトリップ
CFWorkersなどのエッジコンピューティングのメリットは、クライアントが物理的に近い距離のリソースから低遅延にレスポンスが得られることであり、それは、全世界にコンピューティングリソースが配備されていることによって成り立っています。
しかし、データベースは特定のリージョンに配備されいていることが一般的であり、これにより、使用するエッジロケーションによっては、ラウンドトリップタイムが長くなり、パフォーマンスにばらつきが生じる可能性があります。
特に、前述の通り、コネクションの再利用ができない環境下ではこのラウンドトリップによる影響が大きな問題となります。



引用: Choosing Your Backend: Onsite vs Cloud vs Serverless vs Edge

Hyperdrive

Cloudlflareはこの問題に対して、Hyperdriveというサービスを提供することで解決策を提示しました。

https://blog.cloudflare.com/hyperdrive-making-regional-databases-feel-distributed

Hyperdriveは、データベースとエッジコンピューティングとの間に設置される比較的寿命の長いコンピューティングリソースです。その主な役割は、データベースとの間に予めコネクションを確立し維持することにあります。
CFWorkersからは、リクエストのたびにコネクションを確立する必要があることには変わりありませんが、接続の対象はオリジナルのDBではなく物理的に距離が近いHyperdriveであるため、再接続によるレイテンシを大きく削減できるようになります。


引用: Hyperdrive: making databases feel like they’re global

https://zenn.dev/aiji42/scraps/62411e4b0daaed

Turso

一方で、TursoはSQLiteデータベースのレプリカを世界中のロケーションに配備するという、異なるアプローチを取りました。この方法では、データベース自体が分散されるため、どのエッジロケーションからアクセスしても、地理的な距離による影響が小さくなります。

https://blog.turso.tech/announcing-chiselstrike-turso-164472456b29

開発体験の改善

TCPダイレクト接続の導入に伴い、drizzle、kyselyといったORMやクエリビルダが注目を集め、その採用が増加しました。

https://orm.drizzle.team/

https://kysely.dev/

その一方で、Prismaは内部に持つ高度なクエリ最適化エンジンにより、多くの機能を提供していますが、それが比較的大きなバンドルサイズを必要としてしまいます。このサイズは、CFWorkersで許容されるデプロイ可能なバンドルサイズを超えてしまうため、そのままではWorkers環境に適用するのが難しい状態でした。
これにより、Prismaは特に初期段階において、他の軽量なORMやクエリビルダに比べ、CFWorkers上でネイティブに動作することへの適応に遅れを取ってしまいました。

https://www.prisma.io/docs/orm/more/under-the-hood/engines

https://developers.cloudflare.com/workers/platform/limits/#worker-size

この課題に応えるべく、Prismaチームはクエリエンジンの軽量化に取り組んでいます。現在は一部の開発者に向けてβテストを実施しており、フィードバックを得ている状況です。

実際にデプロイしてみると、gzip圧縮後はCFWorkersの有料プランに適合する3MB以下のサイズに収まるように最適化が成功していることがわかります。

現時点ではまだ多くのバグがあり、安定版がリリースされるにはまだ時間がかかりそうですが、期待はできそうです。

まとめ

2023年にCloudflare Workersと外部データベースの連携は大きく進化しました。2022年はWorkersでのコンピューティングに大きな関心が寄せられ、多くの開発者がRemixなどの技術を利用していました。この機運と共に、Workersからリレーショナルデータベースにアクセスするニーズが高まりましたが、当時はTCPでのダイレクト接続が不可能でした。そのため、SupabaseのPostgREST、NeonのWebSocket、PrismaのData Proxyなど、各DBサービスが異なる接続方法を提供していましたが、それぞれ課題がありました。

Cloudflare WorkersはNodeの互換性を高めると同時にTCPダイレクト接続を可能にしました。これにより、pgモジュールなどを用いたデータベースへの直接接続が実現し、ORMやクエリビルダーの人気が高まりました。しかし、Prismaはクエリの最適化エンジンが大きすぎてWorkersにデプロイできず、遅れをとりました。

さらに、WorkersからDBへのTCP接続はコネクション確立時の往復が課題でした。Workersはステートレスであり、コネクションをプールできません。また、DBが一箇所に集中しているのに対し、Workersは全世界に配備されているため、ラウンドトリップタイムが問題でした。この課題に対処するため、CloudflareはHyperdriveを、TursoはSQLiteレプリカを世界中に配備する戦略を打ち出しました。

現在、Prismaはクエリエンジンの軽量化に成功し、3MBのバンドルサイズに収まるようになり、一部のエンジニアに向けたクローズドベータテストを行っています。この分野は引き続き発展しており、来年も大きな進化が期待されます。

GitHubで編集を提案

Discussion