フルスタックをより簡単に
エイプリルフールの今日、誰もが楽しく過ごしたい一方、弊社からはまじめな発表をお届けします。冗談は一切抜きに、Cloudflareのプラットフォーム上で構築する開発者の数は、今日時点で200万人を超えています!
今回のDeveloper Weekは、弊社サーバーレスSQLデータベースであるD1、_既存の_データベースを分散型(しかもより高速)のように感じさせるHyperdrive、そして弊社時系列データベースであるWorkers Analytics Engineの3製品での「プロダクション・レディ(本番環境で利用可能)」への転換をもって皮切りとなります。
開発者がスタック全体をCloudflareに持ち込めるよう長い間取り組んできた一方、Cloudflareで構築するアプリケーションはどのようなものとなるのでしょうか。
概念図自体は、すでに慣れ親しんだツールとそう大きくは変わりません。コアユーザーデータには、データベースが必要になります。アセットとユーザーコンテンツには、オブジェクトストレージが必要となります。メールやアップロード処理などのバックグラウンドでのタスクには、キューが必要となるでしょう。ランタイムのコンフィグには、高速なkey-value storeが必要になります。さらに、ユーザーイベントおよびパフォーマンスデータの集計には、時系列データベースも必要になります。これは、わずかな例を挙げれば検索、推奨、および画像分析タスクなどの多くのアプリケーションの核となりつつあるAI登場前の話です。
しかし、考えるまでもなく、このアーキテクチャは地球全体で実行されており、つまりスケーラビリティ、信頼性、さらにスピードのすべてが整っていることになります。
D1一般公開:本番環境で利用可能
コアデータベースは、インフラストラクチャで最も重要なものの1つで、非常に高い信頼性が必要です。データを紛失することがあってはならず、スケーリングできる必要があります。そのため弊社では、昨年D1が本番環境で利用可能となるよう取り組んできており、この度、弊社のグローバルサーバーレスSQLデータベースであるD1の一般利用が開放されたことをお知らせします。
D1の一般公開では、次に挙げる最も需要の高い機能を実現しました。
10GBデータベース、アカウント当たりデータベース50,000件のサポート
新しいデータエクスポート機能
最も時間またはコストを消費している、もしくは単に非効率的なクエリを把握するための強化されたクエリデバッギング(「D1 Insights」と命名
これにより、開発者がD1で本番環境で利用可能なアプリケーション構築し、すべてのリレーショナルSQLのニーズを満たすことを支えます。さらに、「無料プラン」または「趣味向けプラン」の概念が廃れつつあると思われる時勢の中、弊社では、D1の無料ティアを廃止したり、$5/月のWorkers有料プランに含まれる_読み取り行数250億行_を減らしたりすることはありません。
プラン
読み取り行数
書き込み行数
ストレージ
export default {
async fetch(request: Request, env: Env) {
const {pathname} = new URL(request.url);
let resp = null;
let session = env.DB.withSession(token); // An optional commit token or mode
// Handle requests within the session.
if (pathname === "/api/orders/list") {
// This statement is a read query, so it will work against any
// replica that has a commit equal or later than `token`.
const { results } = await session.prepare("SELECT * FROM Orders");
resp = Response.json(results);
} else if (pathname === "/api/orders/add") {
order = await request.json();
// This statement is a write query, so D1 will send the query to
// the primary, which always has the latest commit token.
await session.prepare("INSERT INTO Orders VALUES (?, ?, ?)")
.bind(order.orderName, order.customer, order.value);
.run();
// In order for the application to be correct, this SELECT
// statement must see the results of the INSERT statement above.
//
// D1's new Session API keeps track of commit tokens for queries
// within the session and will ensure that we won't execute this
// query until whatever replica we're using has seen the results
// of the INSERT.
const { results } = await session.prepare("SELECT COUNT(*) FROM Orders")
.run();
resp = Response.json(results);
}
// Set the token so we can continue the session in another request.
resp.headers.set("x-d1-token", session.latestCommitToken);
return resp;
}
}
Workers 有料
月当り250億行込み
+ 以降100万行当たり$0.001
月当り500億行込み
+ 以降100万行当たり$1.00
5 GB込み
// Use the popular 'pg' driver? Easy. Hyperdrive just exposes a connection string
// to your Worker.
const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
await client.connect();
// Prefer using an ORM like Drizzle? Use it with Hyperdrive too.
// https://orm.drizzle.team/docs/get-started-postgresql#node-postgres
const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
await client.connect();
const db = drizzle(client);
+ $0.75 / GB(月当たり
Workers 無料
500万 / 日
100,000件 / 日
5GB(合計)
D1を開始当初からご覧になっている皆様へ:これはオープンベータ版で発表した価格と同じです
しかし、一般公開だけに留まるわけではありません。D1には、グローバルなリードレプリケーション、さらに大規模なデータベース、データベースの分岐を可能にするより強力なTime Travel機能、Worker内から動的なクエリおよび新規データベースをオンザフライで作成するための新APIなど、主要新機能を複数用意しています。
// Pull and acknowledge messages from a Queue using any HTTP client
$ curl "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/queues/${QUEUE_ID}/messages/pull" -X POST --data '{"visibilityTimeout":10000,"batchSize":100}}' \
-H "Authorization: Bearer ${QUEUES_TOKEN}" \
-H "Content-Type:application/json"
// Ack the messages you processed successfully; mark others to be retried.
$ curl "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/queues/${QUEUE_ID}/messages/ack" -X POST --data '{"acks":["lease-id-1", "lease-id-2"],"retries":["lease-id-100"]}' \
-H "Authorization: Bearer ${QUEUES_TOKEN}" \
-H "Content-Type:application/json"
D1のリードレプリケーションは、必要に応じてリードレプリカを自動的にデプロイし、ユーザーにより近いデータを取得します。さらに、これはスピンアップ、スケーリングの管理、または一貫性(レプリケーションのラグ)問題に煩わされることなく実現します。以下、D1で予定しているレプリケーションAPIの例を掲載します。
要点として、セッションベースの一貫性を保てる能力を開発者に提供するため、ユーザーは自らの変化が反映されていることを認識でき、一方でレプリケーションがもたらすパフォーマンスと遅延向上のメリットが得られます。
// Apply a delay to a message when sending it
await env.YOUR_QUEUE.send(msg, { delaySeconds: 3600 })
// Delay a message (or a batch of messages) when marking it for retry
for (const msg of batch.messages) {
msg.retry({delaySeconds: 300})
}
D1のリードレプリケーションが内部でどのように機能するかについては、詳細を解説した投稿でご覧いただけます。また、さっそくD1上で構築を始めたい場合、開発者ドキュメントで最初のデータベースを作成してください。
Hyperdrive: 一般公開
弊社では、昨年9月のバースデーウィーク中にHyperdriveをオープンベータ化し、現在一般提供しています。つまり、攻撃テスト済みかつ本番環境で利用可能となっています。
Hyperdriveについて把握できていない方のために説明すると、すでに運用している集約化されたデータベースがグローバルなものに感じられるよう設計されたものです。弊社のグローバルネットワークを活用し、データベースへのより早いルート取得、コネクションプールの準備を整え、最も頻繁に実行されるクエリを可能な限りユーザーの近くにキャッシュします。
要点として、Hyperdriveは最も人気が高くすぐに使えるドライバーかつORM(オブジェクト・リレーショナル・マッパー)ライブラリであり、クエリを再学習またはリライトする必要はありません。
しかし、Hyperdriveでの取り組みは「一般公開」となったことだけでは終わりません。今後数か月にかけ、最も広範にわたりデプロイされた_他の_データベースエンジンであるMySQLをサポートする予定です。また、Cloudflare TunnelとMagic WANを経由したプライベートネットワーク(クラウドVPCネットワークを含む)内のデータベースへの接続もサポートする予定です。これに加え、インバリデーションとキャッシング戦略に関する設定可能性を高める計画で、パフォーマンス対データのフレッシュネスに関しよりきめ細かな判断ができるようになります。
Hyperdriveの値段設定について検討するに当たり、課金は不適切であると弊社は判断しました。結局、Hyperdriveがもたらすパフォーマンスのメリットは重要であるだけでなく、従来型のデータベースエンジンに接続するにあたり不可欠なものです。Hyperdriveがない場合、データベースに接続またはクエリを実行するたびにリクエスト当たり6回以上の遅延のオーバーヘッドが発生するのは、正しい状況ではありません。
このため、Workers有料プランをご利用中のあらゆる開発者には、Hyperdriveを無料にしています。これには、複数のHyperdriveを作成する機能とともに、クエリキャッシングと接続プーリングの両方が含まれます。これにより、各種アプリケーション、本番対ステージングの分別、または各種コンフィギュレーション(キャッシュ化対未キャッシュ化など)の提供が実現します。
プラン
クエリごとの料金
接続プーリング
Workers 有料
$0
$0
Hyperdriveを使い始める場合、ドキュメントをお読みになり、Workersからご利用中の既存のデータベースへの接続およびクエリの開始についてご覧ください。
Queues:場所を問わずにプル可能
タスクキューは、現代的なフルスタックのアプリケーション構築においてますます重要な要素となっており、弊社はオープンベータ版のQueuesを発表した当時、このことを気にかけていました。以来Queuesの複数の主要機能に取り組み、その内のプルベースのコンシューマーと新メッセージ配信制御の2つを今週リリースすることにしました。
すべてのHTTPを活用するクライアントは、これよりキューからメッセージをプルできるようになります。キューの新しい/pullエンドポイントをメッセージのバッチから呼び出したり、/ackエンドポイントを呼び出し処理する中、各メッセージ(またはメッセージのバッチ)を認識できるようになります。
プルベースのコンシューマーはどこからでも実行でき、既存の従来型クラウドインフラストラクチャと併せてキューコンシューマーを実行できます。Cloudflareの社内チームは、デバイスのテレメトリを310以上のデータセンターからのキューに書き込み、Kubernetesで実行される舞台裏のインフラストラクチャ内で消費される1つのユースケースに着目し、これを早くより採用しました。重要なのは、弊社のグローバルに分散したキューインフラストラクチャは、コンシューマーによる処理準備が整うまでメッセージがキュー内にとどまることを意味している点になります。
Queuesはまた、キューに送信する際、およびリトライ時にメッセージを作成する際の両方において、メッセージを遅らせることに対応することになりました。これは、将来のタスクを順番待ちとする際、および上流APIまたはインフラストラクチャがメッセージ処理のスピードを調整する必要がある際のレート制限を設けている場合の保険メカニズムとして役立ちます。
弊社ではまた、今後Queuesを一般公開するにあたり大幅に増強されたper-queueを提供する予定でもいます。Queruesが_非常に_信頼性の高いものであることも弊社にとって重要な点です。メッセージが失われたり見落とされたりすると、ユーザーは注文確定メールやパスワードリセット通知を受け取れなかったり、アップロードが処理されなくなったりします。こうした事態はユーザーに影響を及ぼし、修正が難しくなります。
Workers Analytics Engineが一般公開
Workers Analytics Engineは、Workersからのデータポイントを書き込む内蔵API、およびそのデータをクエリするSQL APIにより、無制限カーディナリティ分析を大規模に提供します。
Workers Analytics Engineは、Cloudflareで長年にわたり頼りにされてきた同じClickHouseベースのシステムによって支えられています。弊社では、自社サービスの健全性を確認するために使用しており、請求のための製品利用状況を把握し、特定の顧客の利用パターンについての質問に答えています。ほとんどすべてのCloudflareのネットワークへのリクエストついて、少なくとも1つのデータポイントがこのシステムに書き込まれます。Workers Analytics Engineにより、弊社側が困難な部分を担当しながら、この同じインフラストラクチャを用い独自のカスタム分析を構築できるようになります。
ベータローンチ以降、大型企業からCounterscaleなどのオープンソースプロジェクトまで、こうした同じユースケースなどで開発者はWorkers Analytics Engineに頼りはじめました。Workers Analytics Engineは、長年にわたりミッションクリティカルなワークロードを本番スケールで稼働させてきました。しかし、弊社は本日まで、価格情報について一切の情報を提供してきませんでした。
弊社では、2つの指標に基づき、Workers Analytics Engineの価格をシンプルに保ちます。
書き込まれるデータポイント — writeDataPoint()をWorkerで呼び出す際、1つのデータポイントに書き込まれたとカウントします。データポイントごとに、同額となります。他のプラットフォームとは異なり、ディメンションやカーディナリティ追加に対しペナルティはなく、圧縮されたデータポイントのサイズとコストを予想する必要はありません。
クエリの読み取り — Workers Analytics EngineのSQL APIに配信するたびに、1回のクエリ読み取りとしてカウントします。クエリごとに、同額となります。他のプラットフォームとは異なり、クエリの複雑性に対しペナルティはなく、各クエリによって読み取られるデータの行数を勘案する必要はありません。
Workers FreeおよびWorkers Paidプランの両方で、クエリ書き込みおよび読み取りのデータポイント割当を含んでおり、付加的な利用についてのプライシングは次のようになります。
プラン
書き込まれるデータポイント
クエリ読み取り
Workers 有料
1か月あたり、1,000万込み
追加100万ごとに、+$0.25
1か月あたり、100万込み
追加100万ごとに、+$1.00
Workers 無料
1日当たり、100,000込み
1日当たり、10,000込み
このプライシングにより、Workerで機能を呼び出す回数、およびHTTP APIエンドポイントをリクエストする回数を数えることで、Workers Analytics Engineの利用料金が分かります。複雑な計算は不要で、手計算で算出できるほどシンプルなものとなっています。
このプライシングは、今後あらゆるお客様に適用されるようになります。現時点よりそれまでの間、Workers Analytics Engineは無料でご利用いただけます。今日からさっそく、ご利用中のWorkerからデータポイントを書き込み始めていただけます。必要な時間はわずか数分で、10行未満のコードでデータの取得を始められます。ぜひ、ご利用体験をお聞かせください。
週は始まったばかり
Developer Weekの2日目となる明日のお届け内容も、ぜひご確認ください。ご質問がある場合、またはすでに構築されたものについて共有いただける場合、ぜひ開発者向けDiscordでお聞かせください。