永続ジョブと Readiness
PostgreSQL ジョブキュー、Cron、再試行、重複排除、liveness と依存関係の readiness を運用します。
starter のコミット
7d452a6に同期しています。
なぜ作業を永続化するか
Serverless インスタンスはレスポンス直後に停止することがあります。メール、クレジット付与、オブジェクト削除、アカウントのエクスポートや消去など、必ず完了すべき作業は jobs 表へ書きます。
現在の種類はメール、招待、登録クレジット、Slack、ストレージ削除、予約、アカウントライフサイクルを含みます。
Enqueue
await enqueueJob("welcome_email", { email, name, userUuid }, {
dedupeKey: `welcome:${userUuid}`,
subjectUserUuid: userUuid
});dedupeKey が登録を冪等にします。Subject UUID はプライバシー処理でジョブを取消・消去するために使います。Handler 自身も冪等である必要があります。
Runner
GET /api/cron/jobs は Authorization: Bearer $CRON_SECRET を要求します。Vercel は五分ごとに呼び、他の環境では同じ呼び出しをスケジュールします。
Runner は FOR UPDATE SKIP LOCKED で一件ずつ取得し、重複実行を防ぎます。lease は五分、handler は 20 秒、drain は 40 秒、既定で最大五回を 30 秒から指数バックオフで再試行し、結果を 14 日保持します。未完了アップロードと停滞 Stripe イベントも掃除します。
Liveness と readiness
/api/health はプロセスだけを確認します。/api/ready は環境設定、DB と migration、分散 Redis、キュー状態を確認します。重大な依存障害は 503、キュー障害は degraded として報告します。
頻繁な監視には health、新バージョンへトラフィックを流す前には ready を使います。非 200 と failed job の増加を監視し、payload 変更は後方互換にします。