Cloudflare は、同社のサーバレスアプリケーションプラットフォームである Workers を介したリレーショナルデータベース接続のサポートを導入すると先ごろ発表した。最初のサポートは Postgres と MySQL だ。Cloudflare チームが取り組んでいる課題はまだたくさんあり、コミュニティは貢献する機会がある。
リレーショナルデータベースには、サーバレス接続を困難にする固有の課題がある。ほとんどのデータベースは、アプリケーションサーバとデータベースサーバの間に長時間の TCP 接続が必要だ。Kabir Sikand 氏、Greg McKeon 氏、Ben Yule 氏は、Cloudflare の「Workers ランタイムは現在 TCP 接続をサポートせず、HTTP ベースのデータベースまたはプロキシしかサポートできなかった」と語っている。また、Workers は Node.js と完全な互換性がなく、データベース接続を管理するための既成のクライアントライブラリを利用できないことにも注意が必要だ。
Phil Vuollet 氏は、最近の投稿でサーバレスデータベースの課題を要約した:
接続とネットワークの問題により、データを使用できるアプリケーションノードの数が制限されます。プロビジョニングとスケーリングには、コストや拡張時間など、データベース自体の制限があります。
Cloudflare チームは、Cloudflare クラウドエコシステムの既存のツールを活用することで、これらの課題を乗り越えることができると考えた。まず、cloudflared を使用して、Cloudflare クラウドとデータベースをホストするデータセンタの間に HTTP トンネルを作成した。Cloudflared は、WebSocket を介した HTTP から TCP へのプロキシをサポートし、必要な TCP 接続を解決するのに役立つ。WebSocket を使用してデータベースに接続するために、既存のソケット API ライブラリを適用してシムレイヤを構築した。
この最初のソリューションの一部で、Cloudflare は、Workers を使用した Postgres データベースに接続しクエリを実行する方法のチュートリアルを公開している。このチュートリアルでは、cloudflared などの既存の Cloudflare テクノロジーと、Deno のドライバのシムバージョンを利用している。ピースが配置されると、次のクライアント構成を使用してデータベース接続を確立できる:
const client = new Client({
user: '<DATABASE_USER>',
database: '<DATABASE_NAME>',
// hostname is the full URL to your pre-created Cloudflare Tunnel, see documentation here:
// https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/create-tunnel
hostname: env.TUNNEL_HOST || 'https://dev.example.com',
password: env.DATABASE_PASSWORD, // use a secret to store passwords
port: '<DATABASE_PORT>',
})
await client.connect()
サーバレスリレーショナルデータベースは、まだ一般的ではないが、クラウドでは新しいテクノロジーではない。AWS は、2020年の re:Invent で Aurora Serverless データベースサービス v2 を発表した。v2 への移行で、AWS は Aurora Serverless のスケーリングをインスタンスサイズの2倍を 0.5 Aurora キャパシティユニット (ACU) で増やせるようにする。このサービスはフォールトトレラントであり、us-east-1 リージョンの複数のアベイラビリティーゾーンで利用できる。これを書いている時点で、Aurora Serverless v2 は MySQL と互換性のある Amazon Aurora で利用可能になった。これは、まだプレビュー中だ。
サーバレスアプリケーションでどのリレーショナルデータベースを使用すべきかについての Reddit の質問に答えて、ユーザ localhost87 は、「アーキテクチャのレビューを行うとき、1つの質問は常に「本当にデータベースが必要ですか?」と答えた。スレッドの多数のユーザの間でコンセンサスは同じであり、推奨事項は、メッセージキューや S3 などの代替テクノロジーを検討することだ。
Cloudflare のチームは、このテクノロジーをより簡単に利用できるようにするために多くの改善が必要なことを認めている。主な追加は、TCP のサポートを Worker ランタイムにネイティブに追加することだ。この改善は、生の TCP、UDP、または QUIC プロトコルを使用して接続できる Workers に Socket Workers を付属することです。作業はまだ進行中ですが、Cloudflare のシステムエンジニアである James Snell 氏は、接続イベントはフェッチイベントが現在どのように機能しているかに似ていると語っている:
addEventListener('connect', (event) => {
const enc = new TextEncoder();
const writer = event.socket.writable.getWriter();
writer.write(enc.encode('Hello World'));
writer.close();
});
Snell 氏が「JavaScript にソケット接続の標準 API はない」と述べ、Cloudflare は「さらに別の非標準のプラットフォーム固有の API を開発することに関心がない」と述べている。そのため、すべての JavaScript ランタイムプラットフォームへの呼び出しを拡張して、ソケット接続の新しい標準 API で共同作業を行っている。
Workers を介したリレーショナルデータベース接続サポートに関する最初の発表により、Cloudflare チームは、完全なソリューションの構築に協力する Cloudflare ユーザを探している。興味のある人は、チームに連絡するか、Discord に参加するように招待されている。