Cloud Service
Cloudflare Queues
Workers上で完結するメッセージキュー。送信側と処理側を疎結合にし、Consumer WorkerがバッチでPushされたメッセージを処理する。AWSのAmazon SQSに相当する。
- 1.Producer WorkerがメッセージをキューへPublishし、Consumer WorkerがバッチでPushされて処理する。
- 2.急増するイベントをバッファし、送信側と処理側を独立にスケールさせる。
- 3.at-least-once配信なので処理は冪等に作り、失敗はDead Letter Queueへ退避する。
解決する課題
外部のメッセージブローカーを別途構築・運用せず、Workers上だけで非同期のメッセージング基盤を持てます。
- アクセス急増でバックエンド処理が詰まる → キューでバッファ
- 送信側(Producer)と処理側(Consumer)を疎結合にして独立にスケールしたい
- 失敗したメッセージを安全に退避・再試行したい(Dead Letter Queue)
- Workers環境から追加のインフラなしでキューイングを使いたい
主要概念と用語
- キュー(Queue): メッセージを保持するリソース。作成時に名前を指定し、Producer/Consumerのバインディングと紐づける
- Producer: メッセージをキューへ送信する側。Worker内で
env.QUEUE.send()またはsendBatch()を呼び出す - Consumer: キューからメッセージを受け取り処理する側。Worker型(Push型、バッチ単位で自動起動)とHTTP Pull型(コンシューマが能動的にHTTPで取得)がある
- バッチ(Batch): Consumer Workerに一度に渡される複数メッセージの集合。バッチサイズや待機時間(max_batch_timeout)で挙動を調整する
- リトライ(retry): メッセージ処理に失敗した際、メッセージ単位またはバッチ単位で再試行させる操作
- ack / retry: バッチ内の各メッセージに対し、処理成功なら
ack()、失敗ならretry()を呼んで結果を明示する - Dead Letter Queue(DLQ): 最大リトライ回数を超えたメッセージの退避先として指定できる別のキュー
- 可視性タイムアウトに相当する概念: Cloudflare QueuesはPush型が基本のため、SQSのような明示的な可視性タイムアウトの概念は薄く、Consumer Worker側でのリトライ制御が中心となる
仕様・制限・クォータ
- メッセージのペイロードサイズには上限があり、大きなデータはR2などのオブジェクトストレージに置いて参照(キーやURL)だけをメッセージに載せる設計が推奨される
- 1バッチあたりのメッセージ数、バッチの最大待機時間、リトライ回数の上限などはキュー作成時・Consumer設定時にパラメータとして指定できる
- Consumer WorkerはWorkers標準のCPU時間・実行時間の制約下で動作するため、バッチ処理は時間内に収まるよう設計する
- 配信保証は**at-least-once(最低1回)**であり、まれに同一メッセージが重複して配信され得る
- Consumerには「Push型(Workerが自動起動してバッチを受け取る)」と「Pull型(HTTP APIでコンシューマ側から取得する)」の2方式があり、Workers以外の環境からの利用にはPull型が使われる
内部の仕組み
Producer WorkerがQueueバインディング経由でsend()(単一メッセージ)またはsendBatch()(複数メッセージ)を呼ぶと、メッセージはキューに蓄積されます。Push型Consumerの場合、Cloudflareの基盤がキュー内のメッセージを自動的にまとめてバッチ化し、紐づけられたConsumer Workerのqueue()ハンドラを起動してバッチを渡します。
Consumer Workerはバッチ内の各メッセージを処理し、成功したメッセージにはmessage.ack()、失敗したメッセージにはmessage.retry()を呼び出します。バッチ全体を再試行させることも、メッセージ単位で個別に結果を返すことも可能です。リトライ回数が設定した上限を超えたメッセージは、Dead Letter Queueとして指定した別のキューへ自動的に移動します。
Pull型Consumerの場合は、Workers以外の環境(外部サーバーなど)からHTTP APIでメッセージを取得し、処理後に確認応答を返す方式になります。いずれの方式でも配信保証はat-least-oneのため、重複配信を前提にConsumer側の処理を冪等に実装することが設計の中心になります。
Cloudflare Queuesは「最低1回」配信のため、まれに同じメッセージが再度Consumerへ渡ることがあります。処理は必ず冪等に作り、リトライされても副作用が重複しないようにします。
設計パターン / ベストプラクティス
- Queues + Workers: HTTPリクエストで受けた重い処理をキューに積み、Consumer Workerで非同期に処理して応答を高速化する
- バッチ処理でスループット向上: 1件ずつではなくバッチ単位でまとめて処理し、下流サービスへの呼び出し回数を減らす
- Dead Letter Queueで失敗を退避し、原因調査後に再投入する
- 大きいペイロードはR2などに保存し、キューにはオブジェクトの参照だけを載せる
- Consumer Workerの処理時間が長くなりすぎないよう、重い処理はさらに別のキューやWorkflowsに分割する
運用・監視
- Cloudflareダッシュボードおよびオブザーバビリティ機能で、キューの滞留メッセージ数やConsumerの処理状況を確認できる
- Consumer Workerのログ・例外はWorkersのログ機能(wrangler tailやObservability)で追跡する
- 滞留の増加はConsumer側の処理遅延やエラー、下流サービス障害のシグナルになる
- Dead Letter Queueにメッセージが溜まる場合は、Consumerの処理ロジックや権限、メッセージフォーマットの不整合を確認する
コスト
メッセージの送受信操作数と保持に基づく従量課金が中心です。バッチ処理でリクエスト単価を下げるほどコスト効率が上がります。
| 課金要素 | 内容 | コスト最適化のポイント |
|---|---|---|
| メッセージ操作 | 送信(Publish)や取得などの操作数に応じて課金 | バッチでまとめて送受信し操作回数を減らす |
| Consumer Workerの実行 | Consumer Worker自体のリクエスト数・実行時間に応じて課金 | バッチサイズを適切に設定し呼び出し回数を最適化する |
| Dead Letter Queue | DLQも通常のキューとして扱われ同様に課金される | 原因を早期に解消しDLQへの滞留を減らす |
セキュリティ
- キューへのアクセスはWorkersのバインディング経由に限定され、外部から直接キューを操作するにはCloudflareのAPIトークンによる認証が必要
- Producer/Consumerとして紐づけるWorkerのバインディング設定を最小限にし、不要なWorkerにキューへのアクセス権を与えない
- メッセージ本文に機微情報を直接含めず、必要であれば参照キーのみを載せて実データは別のストレージ側でアクセス制御する
メッセージのペイロードに個人情報や認証情報を平文で含めると、ログや監視系統に漏えいするリスクがあります。参照IDのみをメッセージに載せ、実データは別途アクセス制御されたストレージに置く設計が安全です。
関連サービス・比較
| 観点 | Cloudflare Queues | Amazon SQS |
|---|---|---|
| 位置づけ | Workers向けフルマネージドメッセージキュー | AWSのフルマネージドメッセージキュー |
| 配信モデル | Push型(Consumer Workerへ自動バッチ配信)とPull型(HTTP) | プル型(ポーリング) |
| 配信保証 | at-least-once(最低1回) | 標準はat-least-once、FIFOはexactly-once |
| 処理単位 | バッチ単位でConsumer Workerが起動 | メッセージ単位またはバッチ取得 |
| 失敗の退避 | Dead Letter Queue(リトライ上限で移動) | DLQ(maxReceiveCountで移動) |
| 実行環境 | Cloudflare Workers上で完結 | AWS SDK/API経由で任意の環境から利用 |
ハンズオン / CLI例
# キューを作成
wrangler queues create jobs-queue
# 作成したキューの一覧を確認
wrangler queues list
# wrangler.tomlでProducerバインディングを設定した後、Workerからメッセージ送信(コード例)
# [[queues.producers]]
# queue = "jobs-queue"
# binding = "QUEUE"
# wrangler.tomlでConsumerを設定(バッチサイズや最大待機時間、DLQを指定)
# [[queues.consumers]]
# queue = "jobs-queue"
# max_batch_size = 10
# max_batch_timeout = 5
# dead_letter_queue = "jobs-queue-dlq"
# Dead Letter Queue用のキューを別途作成
wrangler queues create jobs-queue-dlq
# Consumer Workerをデプロイ
wrangler deploy
Cloudflare Service
Cloudflare Queuesを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
アプリ統合
比較で見る軸
クラウド: Cloudflare / カテゴリ: アプリ統合 / 難易度: basic
導入後に効く点
急増するイベントをバッファし、送信側と処理側を独立にスケールさせる。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Cloudflare
- カテゴリ
- アプリ統合
- 難易度
- basic
- 関連資格
- —
- 設計柱
- reliability / performance / cost / operational
判断チェックリスト
- 自社の用途が「アプリ統合 / reliability」に近いか確認する。
- 強みである「Producer WorkerがメッセージをキューへPublishし、Consumer WorkerがバッチでPushされて処理する。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。