Cloudflare K2は、イベント駆動型アーキテクチャにおけるプロデューサーとコンシューマーの整合性を保つという基本的な課題に対処するため、Developer Platformで提供されるサーバーレスイベントストリーミングプリミティブです。Cloudflareの発表によると、従来のRPCアーキテクチャでは、プロデューサーがコンシューマーの処理速度よりも速くデータを送信するか、コンシューマーのダウンタイムによりイベントが失われる問題がよく発生します。K2は、書き込みを吸収しながら独立したリーダーが自分のペースでデータを消費できる耐久性のあるバッファーサービスを挿入することでこれを解決し、パイプラインの両側を効果的に分離します。同社は当初、コンシューマーのダウンタイム時のデータ損失を防止するために耐久性のあるストレージを必要とするBasin Pipelinesの取り込みレイヤーとしてK2を開発しました。

内部では、K2はCloudflareのR2オブジェクトストレージを基盤としたパーティション化された耐久性のあるログを実装しています。従来の追記ベースのログに依存する代わりに、K2はエッジサービス上で書き込みをメモリに蓄積し、完全なセグメントファイルをR2に書き込みます。このシステムはR2のアトミック操作を利用して、別途調整サービスを必要とすることなく厳密に増加するオフセットを達成し、順序を維持します。このアプローチによりコンピューティングとストレージのレイヤーが分離され、独立したスケーリングが可能になり、R2の11ナインの耐久性の恩恵を受けながら低コストで膨大な過去データ量を保存できます。ただし、K2の設計はスケーラビリティと耐久性において大きな利点を提供しますが、オブジェクトストレージへのコミット前に書き込みを蓄積する必要があるため、プロデュースレイテンシーというトレードオフがあります。Cloudflareによれば、初回リリースでは99パーセンタイルで約1秒のレイテンシーが追加されるとのことです。

Durable ObjectsとR2を使用した耐久性のあるイベントストリーミングの図
Cloudflare Durable ObjectsとR2を使用した耐久性のあるイベントストリーミングシステムの図。これはK2のイベントストリーミングアプローチに関連する技術です。github.com

記事ではK2はR2ストレージ上に直接構築されたサーバーレスイベントストリーミングサービスと説明されていますが、この図はDurable ObjectsとR2を使用した類似の概念を示しており、記事で議論された耐久性のあるイベントストリーミングのパラダイムを視覚化するのに役立ちます。

このサービスは、Cloudflareの既存の非同期プリミティブの間に位置付けられています。すなわち、リトライ、遅延、デッドレターキューなどのアイテムごとの複雑なロジックを持つ個々の作業項目の追跡を行うQueues、およびオブジェクトストレージやIcebergテーブルへのイベント書き込みに焦点を当てた取り込みサービスであるBasin Pipelinesです。K2は、大規模なデータ移動、長期保存、ファンアウト消費パターンに最適化されており、メッセージはバッチとして生成および消費され、メッセージレベルのリトライを犠牲にして効率的な処理を可能にします。ユーザーはcf CLI、Wrangler、ダッシュボード、またはAPIを介してストリームを作成し、その後HTTP APIまたはWorkerバインディングを介してイベントを生成し、コンシューマーアプリケーションがストリームから読み取れるサブスクリプションを作成できます。

K2は、Workers Paidサブスクリプションを持つアカウント向けに本日からパブリックベータで利用可能です。ストレージ使用量は10GB、ストリームあたりの生成スループットは30MB/sに制限されています。ベータ期間中の利用は無料で、Cloudflareは今後の価格設定として、生成データ1GBあたり0.04ドル、消費データ1GBあたり0.04ドル、保存データ1GBあたり月0.02ドルを見込んでいます。ロードマップには、書き込みの並列度の向上、メッセージキーおよびキーベースの順序保証、プッシュベースのワーカーコンシューマー、レイテンシーが低いエクスプレスティア、およびApache Kafkaクライアント向けのドロップインサポートが含まれます。