コンテンツにスキップ

検索はプロダクションビルドでのみ利用可能です。 ローカルでテストするには、サイトをビルドしてプレビューしてください。

スケジューリング

一括配信の予約・実行は Cron トリガーCloudflare Queue の組み合わせで実現しています。



即時キューイング(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 → QUEUED

Cron 経由キューイング(8時間以降)

Section titled “Cron 経由キューイング(8時間以降)”

scheduledAt が8時間以降の場合、SCHEDULED ステータスで保存され、Cron トリガーで監視されます。


項目
キュー名broadcast-queue
バッチサイズ100
コンシューマーFizz Service

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);
}
フィールド
messageTypebroadcast
senderId配信作成者の ID
senderTypeshop
displayDays配信設定に準拠
metadata{ broadcastId: "xxx" }

項目
最大リトライ回数3回
リトライ間隔300秒(5分)
リトライ方式再キューイング

14:00 ユーザーが 15:30 予約の配信を作成
→ scheduledAt = 15:30(8h以内)
→ delaySeconds = 5400 で即時キューイング
→ status = QUEUED
15:30 Queue の遅延配信が解除
→ Consumer が処理開始
→ 150件のルームにメッセージ挿入
→ status = SENT, sentCount = 150
10:00 ユーザーが翌日 09:00 予約の配信を作成
→ scheduledAt = 翌日09:00(8h以降)
→ status = SCHEDULED
翌日01:00 Cron 実行(毎時0分)
→ scheduledAt <= NOW + 8h を検出
→ delaySeconds = 28800 でキューイング
→ status = QUEUED
翌日09:00 Queue 遅延解除 → 処理実行 → SENT