先日のデベロッパーウィークで、CloudflareはアウトバウンドTCPソケットを作成するWorker APIを発表した。この新しいソケットAPIによって、開発者はデータベースを含むWorkerから直接TCPベースのインフラに接続が可能になる。
Runtime APIとして利用可能なconnect()関数はTCPソケットを返し、開発者は接続している間データの読み取りと書き込みができる。WorkersはすでにHTTPエンドポイントや他のCloudflareサービスとやりとりが可能であるが、大半のデータベースでは、クライアントが直接TCPソケットを接続する必要がある。CloudflareのプロダクトマネージャーであるBrendan Irvine-Broque氏と、CloudflareのプロダクトディレクターであるMatt Silverlock氏は、こう説明する。
Workersでは、あらゆるブラウザ・非ブラウザ環境でサポートされる標準的なAPIを可能な限りサポートを目指している(中略)しかし、TCPソケットについては、ランタイム間で明確に共有される標準がないという課題に直面した。我々は、既存のAPIや提案の中から最適な要素を取り入れるよう努め、将来の標準化への貢献を目指す。
昨年秋、CloudflareはVercelとShopifyとともに、WinterCGという新しいコミュニティグループを立ち上げ、Webブラウザ以外のJavaScriptベースの開発環境における標準化されたWeb APIの相互運用性の高い実装に焦点を当てた。
新しいAPIは、cloudflare:socketsからconnect関数をインポートすることでアクセスできる。一般的なユースケースの1つは、例えばデータベースへの接続を作成することである。
import { Client } from "pg";
export interface Env {
DB: string;
}
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext
): Promise<Response> {
const client = new Client(env.DB);
await client.connect();
const result = await client.query({
text: "SELECT * from customers",
});
console.log(JSON.stringify(result.rows));
const resp = Response.json(result.rows);
// データベース接続は閉じるがレスポンスの返却はブロックしない
ctx.waitUntil(client.end());
return resp;
},
};
出典: https://blog.cloudflare.com/workers-tcp-socket-api-connect-databases/
PostgreSQL用のJavaScriptデータベースドライバである pg はすでにサポートされているが、MySQLドライバの mysql と mysql2 についてはまだサポートされていない。Irvine-Broque氏とSilverlock氏は警告している。
リクエストごとに新しい接続が作成される。これは、あらゆるプラットフォームで、サーバーレス機能からデータベースに接続する際の現在の最大の課題の1つだ(...)我々はすでに、最も人気のあるデータベースに対する接続プーリングのよりシンプルなアプローチに取り組んでいる。
コンテンツデリバリーネットワークでは、一部の開発者から要望があったインバウンドのTCPおよびUDP接続のサポートや、QUICに基づくアプリケーションプロトコルなど、今後さらに機能を追加することを期待している。
Developer Week 2023で発表された新機能は、connect() APIだけではない。Cloudflareは、アプリケーションシークレットソリューションであるSecrets Store、CloudflareのサーバーレスデータベースであるD1の改善、メッセージングサービスであるQueuesのコンシューマーコンカレンシーについて紹介した。さらに、CloudflareはNeon、PlanetScale、Supabase on Workers向けのデータベース統合を発表。UpLeveledの創設者であるKarl Horky氏は、次のようにツイートしている。
Neonや他のサーバーレス/エッジプロバイダーのようなプロキシはなく、TCPで普通に接続するだけである。これは素晴らしいことで、最近の他のエッジデータベースの発表よりはるかに大きい可能性がある。
また、SMTPメールサーバーにメールを送信するために、ポート25にTCP接続を作成することはできない。