Orbit

Orbit クーロンジョブ

Cron jobs schedule recurring HTTP requests to your deployed project, so a nightly cleanup, an hourly sync or a weekly digest runs on time without you standing up a separate scheduler.

Cron ジョブはあなたのデプロイされたプロジェクトへの定期的な HTTP リクエストをスケジュールするため、夜間のクリーンアップ、時間ごとの同期、または週単位のダイジェストが、別のスケジューラを立てることなく時間どおりに実行されます。

Cron ジョブの場所

Orbit を開き、プロジェクトをクリックして、プロジェクトタブストリップの Configure グループの Crons を選択します。ページのタイトルは Cron jobs で、その機能について説明しています: UTC で標準的な 5 フィールドの cron シンタックス、または @hourly@daily@weekly@monthly のエイリアスを使用して、本番環境へのデプロイメントへの HTTP リクエストをスケジュールします。

ページには呼び出す Target host が表示されるため、正しいデプロイメントを指しているかどうかを一目で確認できます。

Orbit プロジェクトの Cron ジョブページ

しくみ

Orbit はスケジューラーでコードを実行しません。スケジュールに従ってあなたのプロジェクト上の URL を呼び出し、コードが処理を実行します。

つまり、スケジュールするものはアプリケーション内の通常のルートです。例えば /api/cron/cleanup です。アプリがリクエストに応答して実行できることなら何でも、スケジュールに従って実行できます。

Cron ジョブの作成

  1. New cron をクリックします。
  2. Name を付けます。最大 120 文字です。
  3. プロジェクト上の Path を設定し、スラッシュで始めます。
  4. プリセットから Schedule を選択するか、式を入力します。
  5. Method を選択します。GET がデフォルトです。
  6. メソッドが POST、PUT、または PATCH の場合は Request body を追加します。
  7. Timeout を 1 秒から 300 秒の間で設定します。デフォルトは 30 です。
  8. Generate a Bearer secret オプションにチェックを入れたままにします。独自の認証がない限り。
  9. Create cron をクリックします。

スケジュールプリセット

プリセット
5 分ごと*/5 * * * *
15 分ごと*/15 * * * *
1 時間ごと@hourly
毎日 09:00 UTC0 9 * * *
毎日午前 0 時@daily
毎週月曜日 09:000 9 * * 1
毎月 1 日@monthly

または独自の 5 フィールド式を書きます: 分、時間、月の日、月、曜日。

すべてのスケジュールは UTC であり、夏時間調整はありません。0 9 * * * に設定されたジョブは年間を通じて UTC 午前 9 時に実行されます。これはニュージーランド時間に対して年に 2 回 1 時間ズレます。ジョブが特定のローカル時刻に実行される必要がある場合は、UTC の時刻を意図的に選択し、どの半年間に最適化したかを記録してください。

呼び出しの認証

Bearer secret オプションにチェックを入れたままにすると、すべての実行で Authorization ヘッダーとして送信されるランダムトークンが生成されます。これは作成直後に一度表示され、再度表示されることはないというメモが付きます。

それをコピーしてハンドラーで確認します:

export async function GET(req) {
  const auth = req.headers.get('authorization');
  if (auth !== `Bearer ${process.env.CRON_SECRET}`) {
    return new Response('Unauthorized', { status: 401 });
  }
  // do the work
}

プロジェクトの環境変数を使用してシークレットを保存します: Orbit の環境変数 を参照してください。

これのようなチェックがない場合、cron パスは誰でも何度でも呼び出すことができるパブリック URL です。これは無害なものであれば問題ありませんが、書き込み、メール送信、費用が発生するものに関しては深刻です。最初の実行の前にチェックを追加してください。誰かがエンドポイントを発見した後ではなく。

代わりに、アプリケーションがすでに認証スキームを持っている場合は、独自のヘッダーを送信することもできます。

ジョブリストの読み取り

各ジョブは以下を表示します:

  • Schedule: それが実行される式。
  • Next: 次に実行される時刻。
  • Last: 最後に実行された時刻とその結果。
  • ok / fail カウンター。
  • Last error: 最新の失敗がメッセージを残したところ。
  • PAUSED バッジ(オフになっている場合)。

4 つのアクション Run nowPause または ResumeDelete が各行にあります。

Run now はスケジュールに関係なくジョブを即座に実行し、結果を報告します。次のティックを待つのではなく新しいジョブをテストするのに最適な方法です。

実行結果

ステータス意味
OKエンドポイントが成功レスポンスを返しました
FAILEDエンドポイントがエラーを返したか、リクエストを実行できませんでした
TIMEOUTエンドポイントがタイムアウト内に応答しませんでした
SKIPPED実行は実行されませんでした

各実行はそのステータス、レスポンスコード、期間、エラー、およびそれをトリガーしたものと共に記録されるため、間欠的に失敗するジョブは単一の "last error" ではなく読むことのできる軌跡を残します。

タイムアウトの選択

タイムアウトは実行ごとで、1 秒から 300 秒、デフォルト 30 です。

ジョブの実際の最悪のケースのやや上に設定してください。ハングしているジョブに対する寛容なタイムアウトは、ビルダーが何もない状態で待機している 5 分を意味します。正当に 2 分かかるジョブに対する厳しいタイムアウトは恒久的な失敗と誤解を招くアラートを意味します。

さらに良いのは、ハンドラーを高速に保つことです: 作業をキューに入れて即座に返すのであれば、作業をインラインで実行するのではなく。200 ミリ秒で返される cron ジョブはタイムアウトしません。

制限

プロジェクトは最大 50 個の cron ジョブを保持できます。これはプロジェクトごとなので、複数のプロジェクトを持つアカウントはより多くを合計で保有します。

本番環境ではなくステージングに対して何かをスケジュールする必要がある場合は、代わりに SettingsCron triggers を使用してください。そのカードで環境を選択でき、プロジェクトあたり 10 個のトリガーに制限されています。Orbit Project Settings を参照してください。

ジョブの削除

Delete をクリックして確認します。確認では実行履歴も削除されることに注意してください。ジョブがどのように動作したかの記録が必要な場合は、削除する前にそれをキャプチャしてください。

ジョブを一時的に停止する場合は、削除するのではなく一時停止します。一時停止すると、設定、シークレット、履歴がそのまま保持されます。

実用的なアドバイス

ハンドラーをべき等にします。 cron 呼び出しは再試行することができ、Run now はスケジュールされた実行が既に進行中にも押すことができます。ハンドラーは 2 回実行されても処理を 2 回実行しないように対応する必要があります。

時間ごとにすべてをスケジュールしないでください。 すべてのジョブに 0 * * * * を設定すると、すべてのジョブが同じ瞬間に競い合うことになります。広げます: 7 * * * *23 * * * * など。

ハンドラー内でログします。 実行レコードはレスポンスコードと期間を告げます。実際に何が起こったかはアプリケーションのビジネスであり、ジョブが静かに何もしないときにそれが欲しいでしょう。

トラブルシューティング

すべての実行が 401 で FAILED しています。 ハンドラーがリクエストを拒否しています。環境変数に保存されているシークレットが、ここで生成されたものと一致することを確認してください。比較で Bearer プリフィックスを含めて確認してください。

すべての実行が 404 で FAILED しています。 パスがデプロイされたプロジェクト上に存在しません。ページに表示されているターゲットホストに対してブラウザーでテストしてください。

実行がタイムアウトしています。 ハンドラーがインラインで多すぎることをしています。作業を分割するか、作業がそれほど長くかかり、かつ暴走ではない場合はタイムアウトを上げてください。

Next が進みません。 ジョブが一時停止しています。PAUSED バッジを探してください。

ジョブが間違った時刻に実行されます。 UTC をローカル時刻と照らし合わせてください。これはスケジュールされたジョブでの最も一般的な驚きです。

次に進むところ

それでもお困りですか?

こちらまでメールでお問い合わせください support@kapsulehost.com またはKPanelでチャットを開いてください。

KPanel を開く