shiichan

R2 の上に Kafka 級のストリームが!Cloudflare K2 が公開ベータに

みんな、しぃちゃんだよ!イベントストリームを R2 の上で動かす、Cloudflare K2 の発表だよ!

Cloudflare Blog blog.cloudflare.com

なにが発表されたの?

Cloudflare の Blog で、サーバーレスのイベントストリーミングサービス Cloudflare K2 が発表されたよ。R2 オブジェクトストレージの上に直接作られていて、大量のデータ移動と長期保存のためのものなんだって。送る側(プロデューサー)と読む側(コンシューマー)をエッジで切り離して、従来のブローカークラスタの運用なしに、永続的で順序のあるログストリームを扱えるよ。

現在は公開ベータで、Workers Paid プランが必要だよ。

なぜ重要なの?

従来のストリーミングでは、送る側と読む側が規模も時間も合わせる必要があったよ。K2 は、読む側が自分のペースで、イベントを失わずに読めるようにすることでこの問題を解いているんだって。

これで何が変わるの?

  • ブローカークラスタを運用せずに、順序つきの永続ログが使える
  • 計算とストレージが分かれているので、それぞれ独立にスケールできる
  • 長期保存が安く済む

深く潜ってみよう

仕組み

K2 は R2 の上のパーティション化された永続ログだよ。オブジェクトストレージには追記の操作がないので、エッジのサービスがメモリ上で書き込みをためて、完成したセグメントファイルとして R2 に書き込むよ。順序づけは R2 のアトミックな操作で行うので、別の調整サービスは要らないんだって。

保証と性能

  • 耐久性: R2 の「イレブンナイン」の耐久性
  • 順序: ストリーム内でイベントの順序が保たれる
  • 欠損なし: 受け付けたイベントは落とされない
  • 読み方: 作業を分け合うサブスクリプションと、pub/sub の両方に対応
  • 書き込み遅延: p99 でおよそ 1 秒(バッチ処理とオブジェクトストレージの書き込み速度のため)

使い方のイメージ

ストリームの作成はこんなコマンドだよ。

cf k2 streams create --name app_events --http-enabled

Workers のバインディングからの送信はこんな形だよ。

const result = await env.EVENTS.send([{
  content: new TextEncoder().encode(JSON.stringify({event: "page_view"})),
  headers: {"content-type": "application/json"}
}]);

サブスクリプションは作業をコンシューマーで分け合うもので、メッセージは 5 分間リースされるよ。コンシューマーは ack(処理済み)、nack(再配信の要求)、リースの延長ができるよ。

公開ベータの制限と料金

  • アカウントあたりの保存量: 10 GB まで
  • ストリームあたりの書き込み: 30 MB/s まで
  • ベータ中は無料。ベータ後は、書き込み $0.04/GB、読み取り $0.04/GB、保持 $0.02/GB/月

他のサービスとの違い

  • Queues: 個々の作業項目をリトライやデッドレターつきで扱う。K2 は大量データのバッチ移動向け
  • Basin Pipelines: オブジェクトストレージや Iceberg テーブルへの書き込みに特化。K2 は独自の処理や色々な宛先に向く

今後の予定

マルチ GB/s の書き込み並列化、メッセージキーとキー単位の順序、プッシュ型の Workers、低遅延の Express ティア、Apache Kafka クライアント互換が予定されているよ。

まとめ

  • K2 は R2 の上のサーバーレスなイベントストリーム。公開ベータ中
  • 永続・順序つきで、書き込みは p99 でおよそ 1 秒
  • ベータは 10 GB と 30 MB/s の制限つきで無料、将来は従量課金
  • Queues や Basin Pipelines とは用途が違う

Kafka のブローカー運用に疲れた人や、ログの長期保存を安くしたい人に刺さるよ!