Subscribe to receive notifications of new posts:

Relational Database Connectorsのご紹介

2021-11-15

3 min read
Introducing Relational Database Connectors

Cloudflareでは、世界最高のコンピュートプラットフォームを構築しています。私たちは、お客様のアプリケーションを簡単に、シームレスに、そして明白に構築できるようにしたいと考えています。しかし、最高のコンピュートプラットフォームを作るだけでは十分ではありません。アプリケーションの核心は、それらがやり取りするデータです。

Cloudflareでは現在、複数のデータストレージソリューションを用意しています。Workers KVR2Durable 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を利用して、クラウドフレアとお客様の既存インフラ内のプライベートネットワークとの間に安全なトンネルを構築します。私たちの課題は、既存のライブラリが期待するソケットインターフェースのようなインターフェースを提供することと、読み取りと書き込みを私たちのウェブソケットにリダイレクトするように実装を再配線することです。この方法は、高速かつ安全でセキュアですが、最終的な接続先を制御できないという制限があります。これは近いうちに解決する予定ですが、それまでは、レイテンシーとパフォーマンスのデータを収集し、どこを改善すべきかを検討するために、この方法が不可欠です。。

Leveraging Cloudflare Tunnels, we’re able to connect to a relational database

次に、WebSocket を使用してデータベースに直接接続するために、一般的なランタイムのソケット API を適応させる shim-layer を作成しました。これにより、データベースライブラリをフォークしたり、大幅に変更したりすることなく、コードをそのままバンドルすることができます。今回の発表の一環として、既存のCloudflareテクノロジーと、成長中のDenoコミュニティのドライバを使用して、WorkerからPostgresデータベースに接続してクエリを実行する方法のチュートリアルを公開しました。アップストリームのメンテイナーと協力してサポートを拡大していくのを楽しみにしています。

最後に、私たちが最も期待しているのは、このアプローチによってコネクションプーリングと接続確立のオーバーヘッドを管理できるようになることです。現在の技術デモでは、お客様自身のインフラでCloudflare Tunnelをセットアップする必要がありますが、Cloudflareがお客様のためにトンネルをホストするモデルを試験的に導入したいお客様を募集しています。

今後の予定

私たちはまだ始まったばかりです。本日の発表では、リレーショナルデータベースに保存されているデータを扱いながら、新しいアプリケーションの構築や既存のアプリケーションのWorkerへの移行を検討しているお客様を探しています。

Cloudflareがお客様のWebサイトにセキュリティ、パフォーマンス、信頼性を提供することから始まったように、Cloudflareがデータベースの接続を管理し、クラウドプロバイダー間のデータのレプリケーションを処理し、グローバルにデータへの低レイテンシーアクセスを提供する未来に期待しています。

まず、TCPのサポートをランタイムにネイティブに追加すること を考えています。TCPをネイティブにサポートすることで、データベースのサポートが強化されるだけでなく、Workerのランタイムを拡張して、より広範なデータインフラを扱うことができるようになります。

私たちは、ネットワーク層に位置することで、グローバルなデータベースに対して、パフォーマンス、セキュリティ、そして非常に低いエグレスコストを提供することが可能になります。そのためには、現在構築しているHTTPからTCPへのプロキシサービスを再利用し、開発者に代わってデータベースへの接続を管理するコネクションプーリングサービスとして実行します。

最後に、私たちのネットワークは、データをキャッシングし、低遅延でグローバルにアクセスできるようにします。お客様のデータをクラウドフレアのネットワークでグローバルにアクセスできるようにすることで、分散データのための根本的に新しいアーキテクチャを実現することができます。

当社のコネクターをお試しください

試してみたいですか?稼働開始まで3つのステップがあります。

  1. お客様のインフラにcloudflaredを導入します
  2. cloudflaredに接続するデータベースをデプロイします
  3. クエリーを送信するデータベースドライバーを備えたWorkersをデプロイします

Postgresに関するチュートリアルはこちら

完了時は以下のようになります。

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)
    }
  },
}

何か問題がありましたら、 このフォーム Discord、またはメールにてご相談ください。

We protect entire corporate networks, help customers build Internet-scale applications efficiently, accelerate any website or Internet application, ward off DDoS attacks, keep hackers at bay, and can help you on your journey to Zero Trust.

Visit 1.1.1.1 from any device to get started with our free app that makes your Internet faster and safer.

To learn more about our mission to help build a better Internet, start here. If you're looking for a new career direction, check out our open positions.
Full Stack Week (JP)Cloudflare Workers (JP)Postgres (JP)

Follow on X

Kabir Sikand|@kabirsikand
Greg McKeon|@wegmckeon
Ben Yule|@bjyule
Cloudflare|@cloudflare

Related posts

November 20, 2021 1:59 PM

ネットワークパフォーマンスの最新情報:Full Stack Week

2か月と少し前に、世界中のラストワンマイルネットワークの広範なベンチマーク結果を共有しました。さまざまなテスト (TCP接続時間、最初の1バイトを受信するまでの時間(TTFB)、最後の1バイトを受信するまでの時間(TTLB))、また、さまざ...

November 19, 2021 2:00 PM

Cloudflare Workersで、StripeのJavaScript SDKをネイティブサポート

アプリの中で支払いを処理することは、オンラインビジネスを構築する上で非常に重要です。多くの開発者が決済のプラットフォームに選ぶのがStripeです。私が初めてStripeに出会ったのは約7年前ですが、このサービスは単純な支払い処理をはるかに超えて進化しています。...

November 19, 2021 1:59 PM

Cloudflareで次の動画アプリケーションを構築

歴史的に、動画アプリケーションの構築は非常に難しいものでした。動画の録画、エンコード、そして再生の裏には多くの複雑な技術があります。幸いなことに、Cloudflare Streamではすべての難しい部分を取り除くことで、カスタム動画やストリーミングアプリケーションを簡単に構築できます...

November 19, 2021 1:59 PM

CloudflareスタックでのオープンソースCMS:紹介記事

Cloudflareのドキュメントは、コンセプトを学習したり、APIの使用上の注意を確認したりする場合や、APIやコンセプトを説明するための簡潔なスニペットが必要な場合に役立つ資料です。しかし、その資料が網羅的であるとしても、Cloudflare Workersプラットフォームの新規ユーザーは、...