Cloudflareでは、世界最高のコンピュートプラットフォームを構築しています。私たちは、お客様のアプリケーションを簡単に、シームレスに、そして明白に構築できるようにしたいと考えています。しかし、最高のコンピュートプラットフォームを作るだけでは十分ではありません。アプリケーションの核心は、それらがやり取りするデータです。
Cloudflareでは現在、複数のデータストレージソリューションを用意しています。Workers KV、R2、Durable Objectsの3種です。これらはすべてCloudflareのWorkerの設計目標である、「デフォルトでグローバル、無限のスケーラビリティ、開発者にとっての使いやすさ」に沿って作られています。Cloudflareは、この設計目標にぴったり合ったデータプラットフォームを構築したFauna、MongoDB、Prismaといったサードパーティのストレージソリューションと提携し、既にHTTP接続をサポートしているデータベース用のチュートリアルを書いています。
しかし残念なことに、これまで1つの分野が欠如していました。リレーショナルデータベースのサポートです。Cloudflare自身もリレーショナルデータベースで動作していますが、それは私たちだけではありません。4月に、どのNodeライブラリをサポートしてほしいかを尋ねたところ、トップ5のうち4つがデータベースに関するものでした。今回のフルスタック・ウィークでは、「どうすれば設計目標に沿った形でリレーショナル・データベースをサポートできるか」を自問しました。
Cloudflareは本日、そのための第一歩として、PostgresやMySQLを含む関係データベースをWorkersからサポートすることを発表します。
データベースへの接続は簡単な作業ではありません。データベースドライバに接続文字列を渡すだけの簡単な作業であれば、すでに実現していたでしょう。ここにたどり着くまでにいくつかのハードルを乗り越えて現在に至っていますが、まだ克服すべき課題がいくつかあります。
今回の発表の目的は、Workers内でデータベースにアクセスする際に生じるユニークな問題を、開発者である皆さんと一緒に解決することです。私たちと一緒に働きたい方は、このフォームに記入するかDiscord上でご参加ください。 — 取り組みはまだ始まったばかりです。これは始まりに過ぎません。コードを手にして遊びたい方は、こちらのサンプルを使って自分のデータベースに接続してみてください。また、私たちのデモもご覧ください。
Database Connectorsは難しいのか?
サーバーレスのデータベース接続は、いくつかの理由でサポートするのが困難です。
データベースは、アプリケーションサーバーとデータベースの間の長期的な接続を前提としているため、TCP接続を必要とすることがよくあります。Workersのランタイムは現在TCP接続をサポートしていないため、HTTPベースのデータベースやプロキシをサポートすることしかできませんでした。
人間関係のように、接続を確立するだけでは十分ではありません。開発者は、データベース用のクライアントライブラリを使用して、クエリの送信やレスポンスの管理を容易にしています。Workersのランタイムは完全にNode.jsと互換性があるわけではないので、独自のデータベースライブラリを作成するか、サポートされていないビルトインライブラリを使用しないライブラリを見つける必要があります。
最後に、データベースは繊細です。アプリケーションサーバとデータベースの間の共有接続を管理するには、外部ライブラリが必要になることがあります。
これらの課題を克服するために
現在とっているアプローチは、今後クリエイティブな方法でこれらの課題を一つ一つ解決していくための基盤となるものです。
まず、cloudflaredを利用して、クラウドフレアとお客様の既存インフラ内のプライベートネットワークとの間に安全なトンネルを構築します。私たちの課題は、既存のライブラリが期待するソケットインターフェースのようなインターフェースを提供することと、読み取りと書き込みを私たちのウェブソケットにリダイレクトするように実装を再配線することです。この方法は、高速かつ安全でセキュアですが、最終的な接続先を制御できないという制限があります。これは近いうちに解決する予定ですが、それまでは、レイテンシーとパフォーマンスのデータを収集し、どこを改善すべきかを検討するために、この方法が不可欠です。。
次に、WebSocket を使用してデータベースに直接接続するために、一般的なランタイムのソケット API を適応させる shim-layer を作成しました。これにより、データベースライブラリをフォークしたり、大幅に変更したりすることなく、コードをそのままバンドルすることができます。今回の発表の一環として、既存のCloudflareテクノロジーと、成長中のDenoコミュニティのドライバを使用して、WorkerからPostgresデータベースに接続してクエリを実行する方法のチュートリアルを公開しました。アップストリームのメンテイナーと協力してサポートを拡大していくのを楽しみにしています。
最後に、私たちが最も期待しているのは、このアプローチによってコネクションプーリングと接続確立のオーバーヘッドを管理できるようになることです。現在の技術デモでは、お客様自身のインフラでCloudflare Tunnelをセットアップする必要がありますが、Cloudflareがお客様のためにトンネルをホストするモデルを試験的に導入したいお客様を募集しています。
今後の予定
私たちはまだ始まったばかりです。本日の発表では、リレーショナルデータベースに保存されているデータを扱いながら、新しいアプリケーションの構築や既存のアプリケーションのWorkerへの移行を検討しているお客様を探しています。
Cloudflareがお客様のWebサイトにセキュリティ、パフォーマンス、信頼性を提供することから始まったように、Cloudflareがデータベースの接続を管理し、クラウドプロバイダー間のデータのレプリケーションを処理し、グローバルにデータへの低レイテンシーアクセスを提供する未来に期待しています。
まず、TCPのサポートをランタイムにネイティブに追加すること を考えています。TCPをネイティブにサポートすることで、データベースのサポートが強化されるだけでなく、Workerのランタイムを拡張して、より広範なデータインフラを扱うことができるようになります。
私たちは、ネットワーク層に位置することで、グローバルなデータベースに対して、パフォーマンス、セキュリティ、そして非常に低いエグレスコストを提供することが可能になります。そのためには、現在構築しているHTTPからTCPへのプロキシサービスを再利用し、開発者に代わってデータベースへの接続を管理するコネクションプーリングサービスとして実行します。
最後に、私たちのネットワークは、データをキャッシングし、低遅延でグローバルにアクセスできるようにします。お客様のデータをクラウドフレアのネットワークでグローバルにアクセスできるようにすることで、分散データのための根本的に新しいアーキテクチャを実現することができます。
当社のコネクターをお試しください
試してみたいですか?稼働開始まで3つのステップがあります。
お客様のインフラにcloudflaredを導入します
cloudflaredに接続するデータベースをデプロイします
クエリーを送信するデータベースドライバーを備えたWorkersをデプロイします
Postgresに関するチュートリアルはこちら。
完了時は以下のようになります。
何か問題がありましたら、 このフォーム、 Discord、またはメールにてご相談ください。
import { Client } from './driver/postgres/postgres'
export default {
async fetch(request: Request, env, ctx: ExecutionContext) {
try {
const client = new Client({
user: 'postgres',
database: 'postgres',
hostname: 'https://db.example.com',
password: '',
port: 5432,
})
await client.connect()
const result = await client.queryArray('SELECT * FROM users WHERE uuid=1;')
ctx.waitUntil(client.end())
return new Response(JSON.stringify(result.rows[0]))
} catch (e) {
return new Response((e as Error).message)
}
},
}