Cloudflare Workersでリアルタイム分析基盤を構築した話 - エッジファーストなアーキテクチャの実践
Cloudflare Workers上にリアルタイム分析プラットフォームを構築した開発者が、アーキテクチャの全容を公開した。「サブ100msのグローバルイベント取り込み、リアルタイムダッシュボード、Cookie不使用」を掲げた、エッジファーストなアプローチの詳細な解説だ。
全体アーキテクチャ
データフローはシンプルな3層構造になっている。
- ブラウザのトラッキングスクリプト
- Cloudflare Worker(Hono.jsで構築)
- 3つの永続化レイヤー: KV、Workers Analytics Engine、Supabase PostgreSQL
ダッシュボードへの更新はSupabase RealtimeのWebSocket経由で配信される。V8アイソレートで動作するため、従来のサーバーレス関数にありがちなコールドスタート問題が事実上存在しない(5ms未満)。
Cookieを使わないセッション管理
プライバシーを重視したアプローチとして、Cookieやフィンガープリンティングを一切使わずにセッションを識別している。
- session_id:
sessionStorageにcrypto.randomUUID()で生成(タブを閉じると消える) - visitor_id:
localStorageにcrypto.randomUUID()で生成(365日間保持)
このアプローチはシークレットブラウジングやデバイス切り替えで5〜15%程度の過剰カウントを許容するが、個人追跡を行わないトレードオフとしては妥当な設計だ。
パフォーマンス最適化の工夫
重複排除
KVベースの5秒間のデデュプリケーションウィンドウを設けている。リロードや一時的な切断時に重複した書き込みが走るのを防ぐ仕組みだ。
データベース負荷の制御
Supabaseへの書き込みが30〜40msと処理のボトルネックになるため、いくつかの工夫を入れている。
- Upsert操作で複数イベントを単一のビジターレコードに集約
Math.max()で順序外の更新によるレースコンディションを防止- ML値スコアリングは5回目のハートビートごと、スクロールやインタラクション変更時のみ再計算
- 高カーディナリティクエリはWorkers Analytics Engineに二重書き込みしてPostgresをバイパス
レート制限の効率化
レート制限のKV書き込みを、毎リクエストではなく90%閾値到達時にのみチェックする方式に変更。これでオーバーヘッドが約95%削減された。
リアルタイムダッシュボード
2層アプローチを採用している。
- 即時性: KVカウンターでライブ訪問者数を表示(5分のTTLで自動クリーンアップ)
- 詳細更新: Supabase RealtimeチャネルがPostgreSQLのLISTEN/NOTIFYを介して更新を配信(合計レイテンシ約400ms)
ダッシュボードはMapbox GL JSを使い、訪問者のバリュースコアに応じた色分けマーカーを地図上に表示する。
実測パフォーマンス
| メトリクス | 値 |
|---|---|
| イベント取り込み P95 | 47ms(グローバル) |
| イベント取り込み P99 | 89ms |
| ダッシュボードレイテンシ | 約400ms |
| コールドスタート | 5ms未満 |
| レート制限精度 | 99.7% |
実運用で得た教訓
うまくいった点と課題がそれぞれ明確に語られている。
成功した選択:
- Hono.jsはExpressスタイルのAPIをNode.jsなしで提供してくれる
- Cloudflareの
cfオブジェクトによるジオロケーションデータが無料で使え、外部API呼び出しの100msを節約できた - KVの結果整合性はデデュプリケーションやレート制限用途には十分
苦労した点:
- Supabase公式SDKがNode.js依存のためWorkersで動作しない。カスタムPostgRESTクライアントを自作する必要があった
- KVの書き込み制限(1ネームスペースあたり1,000/秒)のためにアーキテクチャ調整が必要だった
- ステートレスなWorkersからSupabaseへの接続チャーンでP99レイテンシが増加した
次にやるなら変えること:
- Workers Analytics Engineを初日からプライマリストアにする
- 一貫性のあるライブカウントにはDurable Objectsを使う
- Supabaseへの呼び出しを単一RPC操作にバッチ化する
エッジコンピューティングで分析基盤を構築する際の実践的なリファレンスとして、かなり参考になるアーキテクチャ解説だった。
How We Built a Real-Time Analytics Platform on Cloudflare Workers - DEV Community