IT-Q

失敗したジョブはどうなりますか。

指定回数リトライし、超えると failed_jobs テーブルに落ちます。回数と間隔は tries と backoff で指定します。sync ドライバの同期実行はここに入らない点が落とし穴です。

面接官が見ているのは「投げたら終わり」になっていないか。

これは「どういう処理をキューに逃がすのが妥当ですか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • 指定回数リトライし、超えると failed_jobs テーブルに記録される
    その通りです。重要なのは、落ちたことに誰も気づかない状態を作らないこと。failed() で通知を飛ばすか、failed_jobs の件数を監視します。
  • 自動的に無限リトライされ続ける
    tries で上限があります。無限だとワーカーが詰まります。
  • 何も記録されずに消える
    failed_jobs に残ります。ただし見に行かなければ気づけないのは事実です。
  • 例外がそのままユーザーの画面に表示される
    別プロセスで動いているので、ユーザーのリクエストとは既に切り離されています。だからこそ気づきにくいのです。

面接官は何を見ているか

  • リトライ回数(tries / backoff)に触れた
  • failed_jobs テーブルに記録されることを知っていた
  • 失敗に気づく仕組み(通知 / 監視)に触れた

模範解答

指定回数リトライし、超えると failed_jobs テーブルに落ちます。tries と backoff で回数と間隔を指定します。注意点として、failed_jobs に入るのは非同期で投げたジョブだけです。sync ドライバで同期実行したジョブの失敗は記録されず、その場で通常の例外として扱われます。開発環境が sync だと、失敗の記録を確認する導線ごと存在しないことになります。重要なのは、落ちたことに誰も気づかない状態を作らないことです。failed() メソッドで通知を飛ばすか、failed_jobs の件数を監視します。復旧は queue:retry で再投入できます。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。