スケジューリング
一括配信の予約・実行は Cron トリガー と Cloudflare Queue の組み合わせで実現しています。
キューアーキテクチャ
Section titled “キューアーキテクチャ”即時キューイング(8時間以内)
Section titled “即時キューイング(8時間以内)”scheduledAt が現在から8時間以内の場合、作成時に直接キューに投入します。
const delaySeconds = Math.max(0, (scheduledAt.getTime() - Date.now()) / 1000);
await env.BROADCAST_QUEUE.send( { broadcastId }, { delaySeconds } // Cloudflare Queue の遅延配信);// status → QUEUEDCron 経由キューイング(8時間以降)
Section titled “Cron 経由キューイング(8時間以降)”scheduledAt が8時間以降の場合、SCHEDULED ステータスで保存され、Cron トリガーで監視されます。
Queue Consumer の処理
Section titled “Queue Consumer の処理”| 項目 | 値 |
|---|---|
| キュー名 | broadcast-queue |
| バッチサイズ | 100 |
| コンシューマー | Fizz Service |
バッチ挿入の制約
Section titled “バッチ挿入の制約”PostgreSQL のパラメータ上限(65,535)を考慮し、メッセージ挿入を5,000件ずつに分割します。
// 対象ルーム数が多い場合、チャンクに分割const CHUNK_SIZE = 5000;for (let i = 0; i < messageValues.length; i += CHUNK_SIZE) { const chunk = messageValues.slice(i, i + CHUNK_SIZE); await db.insert(chatMessage).values(chunk);}配信メッセージの特徴
Section titled “配信メッセージの特徴”| フィールド | 値 |
|---|---|
messageType | broadcast |
senderId | 配信作成者の ID |
senderType | shop |
displayDays | 配信設定に準拠 |
metadata | { broadcastId: "xxx" } |
リトライ処理
Section titled “リトライ処理”リトライ設定
Section titled “リトライ設定”| 項目 | 値 |
|---|---|
| 最大リトライ回数 | 3回 |
| リトライ間隔 | 300秒(5分) |
| リトライ方式 | 再キューイング |
リトライフロー
Section titled “リトライフロー”タイムライン例
Section titled “タイムライン例”14:00 ユーザーが 15:30 予約の配信を作成 → scheduledAt = 15:30(8h以内) → delaySeconds = 5400 で即時キューイング → status = QUEUED
15:30 Queue の遅延配信が解除 → Consumer が処理開始 → 150件のルームにメッセージ挿入 → status = SENT, sentCount = 15010:00 ユーザーが翌日 09:00 予約の配信を作成 → scheduledAt = 翌日09:00(8h以降) → status = SCHEDULED
翌日01:00 Cron 実行(毎時0分) → scheduledAt <= NOW + 8h を検出 → delaySeconds = 28800 でキューイング → status = QUEUED
翌日09:00 Queue 遅延解除 → 処理実行 → SENT- 一括配信 概要 - ライフサイクル
- ターゲティング - 対象者の絞り込み
- Fizz RPC メソッド - 配信関連 RPC
- インフラストラクチャ - Queue 設定