
2026/10/01 23:09
Cloudflare K2:サーバーレスイベントストリーム
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Cloudflare は、Developer Platform にて展開する K2 を公開しました。K2 は、従来型の RPC アーキテクチャに固有であるデータアライメントとデータロスの問題を解決するために設計された、耐久性のあるイベントストリーミングプリミティブです。K2 の設計では、順序付いたイベントログを直接 R2 オブジェクトストレージ上に保存することで、複製とコンセンサスを R2 に委譲し、内部の分散状態を管理せずにスケーラブルで低コストかつ高パフォーマンスなアプリケーションを構築可能としています。初期実装では追加書き込みではなく完全なセグメントファイルを R2 に書き込む方式を採用しており、標準的な手法と比較して 99 パーセンタイルレベルで「produce」レイテンシに約 1 秒の増加分が生じます。K2 は大規模なデータ移動とファナウト消費に特化されており、Queues(高コストなワークアイテム)や Basin Pipelines(サーバーレスインゲスチョン)とは明確に異なります。クライアントは HTTP バッチまたは Worker バインディングを通じてイベントをプロデュースし、
consume の際に各バッチのプロセッシングに対して 5 分間のリースを取得し、その間に承認、拒否、あるいはリースの延長を行うことができます。ストリームは cf、Wrangler、ダッシュボード、または API を通じて作成可能で、カスタマイズ可能な保存期間を設定できます。現在、Workers Paid サブスクライバー向けに公開ベータ版として利用可能であり、10 GB のストレージ上限とストリームあたり 30 MB/s のプロデュース制限を有していますが、ベータ期終了後には使用量に基づいた課金制(プロデューズ済み/消費されたデータ:0.04 ドル/GB、保持されたデータ:月額 0.02 ドル/GB)への移行が行われます。将来的な計画としては、マルチ GB/s ストリーム、メッセージキー、プッシュベースのワーカー、Express 階層、そしてネイティブ Apache Kafka クライアントサポートの追加が予定されています。本文
Cloudflare K2:サーバーレス・耐久性のあるイベントストリーミングサービス
概要と課題
従来のリモートプロシージャコール(RPC)アーキテクチャには、以下のような核心的な課題が存在します。
- データ損失のリスク: プロデューサーがコンシューマーの処理能力を超えたデータを送出したり、下流サービスが利用不能になったりすると、イベントデータは失われます。
- マルチコンシューマの複雑さ: 複数の消費者が独立してデータを処理する際、この問題は深刻化します。
解決策: プロデューサーとコンシューマーを繋ぐ「中間サービス」を導入することで、読み取り側が自身のペースで消費できる環境を作り出します。
Cloudflare K2 の概要
本日リリースされた K2 は、開発者プラットフォーム上で動作する耐久性のあるイベントストリーミングのプリミティブです。
主な特徴
- 耐久性: R2 オブジェクトストレージの上に分割されたログを実装しており、膨大なデータ量に対応可能です。
- サーバーレス: 設定や運用の手間を省き、長期的なデータ保持をサポートします。
- 柔軟な消費方法:
- 読み取りを複数のコンシューマー間で分割する(並列化)
- すべてのメッセージをすべてのコンシューマーに配信する(ファンアウト)
K2 の仕組みとアーキテクチャ
インフラ上の課題と強み
K2 を設計する際、Cloudflare グローバルインフラ特有の「ステートフルサービス」の課題と強みを活用しています。
課題:
- 比較的小さなスライスのマシンを使用
- マシンは一過性(エフェメラル)である
- ネットワーキングがパブリックインターネット上で行われる
強み(超能力):
- ユーザーに近い位置にあるグローバル展開
- 水平スケーリングによる驚異的な容量
設計方針:R2 オブジェクトストレージの活用
K2 は、すでに高い耐久性を持つ R2 オブジェクトストレージ に依存することで、アプリケーション層を劇的に単純化し、低コストかつ高パフォーマンスを実現しています。
- 利点: レプリケーションとコンセンサスをストレージ層にオフロードできるため、計算リソースとストレージを分離して独立スケーリングが可能。
- 欠点: オブジェクトストレージへの書き込みはローカルディスクより遅いため、初期リリースでは応答時間の 99 パーセンタイルで最大約 1 秒 の遅れが発生します(今後の改善予定)。
ログをオブジェクトストレージ上に構築する方法
- R2 は追加操作(Append)をサポートしないため、一度書き込む「セグメント」という完全なファイルを作成する必要があります。
- 実装フロー: Edge サーバサイドでメモリに書き込みを蓄積 → 一定量を集計 → R2 に原子操作を使用してセグメントファイルとして書き出し。
- これにより、順序性と厳密に増分するオフセットを実現し、別途協調サービスを用意する必要はありません。
ストリーム、キュー、パイプラインの使い分け
既存プロダクトとの位置づけと使い分けは以下の通りです。
Queues(キュー)
- 目的: 高価または時間のかかる作業の個々のアイテムを追跡。
- 特徴: 「プルベース」モデル。特定のワークアイテム粒度で複雑なロジック(再試行、遅延など)をサポート。
- 利用例: 画像処理サービスへのリクエストキュー入れ。
K2 Streams(ストリーム)
- 目的: 大規模なデータ移動、長期の保持、ファウト(Fan-out)消費。
- 特徴: メッセージをバッチとして生産・消費。効率的な処理が可能だが、メッセージレベルの再試行には不向き。
Basin Pipelines(パイプライン)
- 目的: サーバーレスの取り込みサービス。イベントを変換して R2 または Catalog に書き込む。
- 推奨: 結果をオブジェクトストレージまたは Iceberg テーブルに書く場合。
- K2 の推奨: 独自のプロセッシングを行う場合や、他の宛先にデータを配信する場合。
スタートガイド:実装例
アカウント内には、異なる使用ケース用に多数のストリームを作成できます。以下は
cf コマンドによる作成例です。
1. ストリームの作成
cf k2 streams create --name app_events --http-enabled
出力例:
{ "id": "d78b09ee1f50430e9ec92a8af92b0231", "name": "app_events", "retention_seconds": 604800, "endpoint": "https://d78b09ee1f50430e9ec92a8af92b0231.k2.cloudflarestorage.com", // ... その他設定情報 }
2. イベントの書き込み(プロデュース)
Worker から HTTP API を通じてイベントを送信します。K2 はバイト列として扱うため、JSON など適宜の形式で構いません。
const result = await env.EVENTS.send([ { content: new TextEncoder().encode( JSON.stringify({ event: "page_view", path: new URL(request.url).pathname, timestamp: Date.now(), }), ), headers: { "content-type": "application/json" }, }, ]); if (!result.success) { console.error(`Produce failed: ${result.error.message}`); return new Response("Failed to record event", { status: result.error.retryable ? 503 : 500, }); }
3. サブスクリプションの作成(購読)
コンシューマー間の作業を分割し、読み取りの並列化を実現します。
curl -X POST "https://d78b09ee1f50430e9ec92a8af92b0231.k2.cloudflarestorage.com/subscriptions" \ -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \ -H "Content-Type: application/json" \ --data '{ "name": "analytics_processor", "start_at": { "type": "earliest" } }'
4. データの消費(ポーリング)
サブスクリプションに対してデータを取得し、処理後のアクションを行います。
curl -X POST "https://.../subscriptions/{sub_id}/consume" \ -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \ -H "Content-Type: application/json" \ --data '{ "worker_id": "analytics-1", "max_records": 100 }'
処理後のアクション(リース管理): 取得されたバッチは 5 分間 リースされます。以下のいずれかの行動が必要です。
- ack: 処理済みとしてマークし、再配送を防ぐ。
- nack: 処理失敗を報告し、再配送をリクエストする。
- extend: 処理に時間がかかっている場合、リース期間を延長する。
curl -X POST "https://.../subscriptions/{sub_id}/batches/{batch_id}/ack" \ -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \ --data '{ "worker_id": "analytics-1" }'
消費パターンの選択肢:
- 分割処理: 複数のコンシューマー間で作業を分け、各々が一部ずつ持つ方式。
- Pub/Sub パターン: 各消費者が別々のサブスクリプションを持ち、すべてのメッセージを見る方式。
- ハイブリッド: 上記両方のアプローチを組み合わせて、複数の独立したコンシューマープールを構築する方式。
プライスと利用状況
K2 は現在、Workers Paid サブスクリプション お持ちのアカウント向けにパブリックベータ版を提供しています。
ベータ版制限
- ストレージ使用量: 最大 10GB
- ストリームあたりの生産速度: 30MB/s
リミットについて: より高いリミットが必要の場合は、Discord でチームにお問い合わせいただくか、リミット増加フォームをご記入ください。ベータ期間中は請求されません。
料金表(推定価格)
| カテゴリ | 単価 |
|---|---|
| 生成されたデータ (Data Produced) | $0.04 / GB |
| 消費されたデータ (Data Consumed) | $0.04 / GB |
| 保持されたデータ (Data Retained) | $0.02 / GB / ヶ月 |
今後の展望(ロードマップ)
今後数ヶ月以内に以下の機能が追加されます:
- 書き込み並列性の向上: マルチ GB/s ストリームへの対応。
- キーベース機能: メッセージキーとキーベースの順序付け保証の実装。
- プッシュモデル: プッシュベースのワーカーコンシューマーのサポート。
- Express エディション: より低い生産遅延およびエンドツーエンド遅延を実現するエディション。
- Kafka クライアント: Apache Kafka クライアントのドロップインサポート。
素晴らしいアプリケーションをご期待ください!ご意見やご感想は Cloudflare Discord で共有してください。