ジョブ、cron、および配信不能キュー
リクエスト外でワークを実行する方法: ジョブとは何か、ジョブがどのように再試行されるか、cron がジョブを作成する方法、そして終了したジョブをどうするか。
1. ジョブをキューに入れる
ジョブは、関数に対する 1 つのバックグラウンド呼び出しです。 service_role キーを使用してサーバーからそれをキューに入れます。
| オプション | デフォルト | 意味 |
|---|---|---|
payload | null | リクエストボディとして関数に渡されるJSON |
delaySecs | 0 | 最初の試行の前に待機する秒数。それまでジョブは pending のままです。 |
maxAttempts | 3 | 最初の試行を含む合計試行数 |
getJob(id) または listJobs({ status, limit }) を使用してジョブを読み取ります (limit は 1 ~ 500、デフォルトは 50)。ジョブには status、 attempts、 max_attempts、 error があり、日付は scheduled_at、 started_at、 completed_atです。
enqueueJob、 getJob 、および listJobs には service_role キーが必要です。公開鍵は 403を受け取ります。
2. 関数が受け取るもの
ジョブは他のリクエストと同様に関数を呼び出しますが、次の 3 つの違いに対処する必要があります。
| パート | 値 |
|---|---|
| 方法 | JOB ( POSTではありません) |
| パス | /jobs/<job id> |
| 本体 | ジョブの payload(JSON として) |
| アイデンティティヘッダー | なし: x-aura-role および x-aura-user-id は存在しません |
実際の呼び出しは {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}として記録されました。
ジョブはユーザーなしで実行されます。 x-aura-user-idに依存しないでください。作品がユーザーに属している場合は、ペイロードにユーザーの ID を入れます。
3. ライフサイクルと再試行
- ジョブは少なくとも 1 回実行されます。実行中にワーカーが停止すると 2 回実行される可能性があるため、関数を冪等にします。
- 失敗した試行は、
maxAttemptsに達するまで、5 秒の固定遅延の後、再試行されます。ジョブはdeadになります。遅延とデフォルトの試行回数はサービス設定 (JOB_RETRY_DELAY_SECS、JOB_MAX_RETRIES) です。 - リース (デフォルトでは 450 秒) 後も
runningのままのジョブは、サービスによって再利用されます。 - 完了したジョブはデフォルトで 14 日間保存されます。
ステータス コードが何であれ、関数が応答するとすぐにジョブは completed になります。実際の実行では、500 を返す関数は 1 回の試行後に completed ジョブを生成し、再試行されることはありませんでした。
ジョブは失敗し、呼び出し自体が失敗した場合にのみ再試行されます。つまり、関数が存在しないか非アクティブであるか、ランタイムに到達できないか、呼び出しがタイムアウトになった場合です。独自のコードでエラーが検出されたときに再試行したい場合は、ステータス コードに依存するのではなく、ハンドラーから新しいジョブを (バックオフ用の delaySecs を使用して) キューに入れます。
同じ実際の実行で、存在しない関数のジョブは次のシーケンスを経ました。試行 1 は Fonction 'ghost' introuvableで 3 秒で失敗し、試行 2 は約 9 秒で失敗し、ジョブは dead になり、 attempts は max_attemptsと同等になりました。
4. 配信不能キュー
死んだジョブはキュー内に残り、一覧表示して再試行できます。これらのルートにはまだ SDK メソッドがありません。service_role キーを持つ HTTP を使用してください。
再試行すると、ジョブは試行カウンタをリセットせずに pending に戻されるため、あと 1 回だけ試行され、再度失敗した場合は dead に戻ります。再試行する前に、原因を修正してください (欠落している関数をデプロイするなど)。
5. cronによるスケジュール設定
cron エントリは関数自体を呼び出しません。関数が起動されるたびに、ジョブがキューに入れられます。
- スケジュールには、5 フィールド (
min hour day month weekday) または 6 フィールド (sec min hour day month weekday) があります。 5 フィールドのスケジュールは0秒前に取得されます。*/1 * * * *は0 */1 * * * *として保存されます。 @dailyなどのエイリアスは、予期される形式を示す400で拒否されます。- 時間は UTC です。
last_runおよびnext_runは、最初の起動まではnullです。実際の実行では、15:40 に作成されたスケジュールは 15:41:00 に起動され、next_run15:42:00 と表示されました。- エントリの作成時にペイロードは凍結されます。
- 不明な名前を削除すると、
404が返されます。 cron エントリを削除すると、cron エントリの起動も停止します。 - SDK には
getCronJobまたはupdateCronJobがありません。エントリを削除して、再度作成してください。
純粋なデータベース作業の場合、Postgres pg_cron 拡張機能は関数への往復を回避します。Cron ページを参照してください。