ハンズオン

永続ジョブと 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/jobsAuthorization: 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 変更は後方互換にします。

永続ジョブと Readiness · Sushi SaaS