web-dev-qa-db-ja.com

ジョブの試行回数が多すぎるか、実行時間が長すぎます

私はローカルで問題なく動作する仕事を持っていますが、本番環境では動作しない問題に遭遇します。 handle()全体をtry/catchで網羅しましたが、他の多くの例外が展開されているにもかかわらず、Bugsnagに記録されたものは何もありません。

public function handle() {
    try {

        // do stuff

    } catch (\Exception $e) {
        Bugsnag::notifyException($e);

        throw $e;
    }
}

Laravel Horizo​​n によると、このキュージョブは0.0026001930236816406秒間実行され、このジョブに関連するため、failed_jobsテーブルで動作せず、他のエラーも表示されません。

config/queue.php

    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => 'default',
        'retry_after' => (60 * 10), // 10 minutes
        'block_for' => null,
    ],

config/horizo​​n.php

'environments' => [
    'production' => [
        'supervisor'        => [
            'connection'    => 'redis',
            'queue'         => [
                'default',
            ],
            'balance'       => 'auto',
            'processes'     => 10,
            'tries'         => 3,

            // 10 seconds under the queue's retry_after to avoid overlap
            'timeout'       => (60 * 10) - 10, // Just under 10 mins
        ],

何かがこのジョブを何度も再試行させる原因になっている場合、どうすれば見つけることができますか?私は迷っています。

これまでの調査

  • 私の期待は、クエリを実行できるはずです:
SELECT DISTINCT exception, COUNT(id) as errors
FROM failed_jobs 
WHERE payload LIKE '%[TAG-JOB-HAS]%' 
GROUP BY exception;

このエラーメッセージ以外のものを表示するには:

ジョブの試行回数が多すぎるか、実行時間が長すぎます

しかし、それは私が見るすべてです。

  • Laravel Horizo​​n のダッシュボードは、問題のジョブが1秒未満実行されていることを示しているため、実際にはタイムアウトになっていません。
11
Webnet

Laravelによって指定された失敗したメソッドで例外をキャッチしよう

/**
* The job failed to process.
*
* @param  Exception  $exception
* @return void
*/
public function failed(Exception $exception)
{
    // Send user notification of failure, etc...
}

そして、ローカルのデフォルトキュードライバが同期されているかどうかを確認してから、その予想される動作を確認します。

6
Anil Kumar

documentation によると、次の2つの一般的な方法でジョブの失敗を処理できます。

  • 失敗したジョブイベントの使用
  • failed()メソッドを使用します。

最初のケースでは、Queue::failing()メソッドを使用してすべてのジョブを処理できます。 _Illuminate\Queue\Events\JobFailed_イベントをパラメーターとして受け取りますが、例外が含まれています。

別のケースでは、failed()メソッドを使用できます。handle()メソッドの近くに配置する必要があります。 _Exception $exception_をパラメーターとして受け取ることもできます。

例:

_public function failed(\Throwable $exception)
{
    // Log failure
}
_

お役に立てれば。

4
a_sarana

同じ問題があった

「retry_after」パラメーターを増やして修正しました

retry_after値が、ジョブの実行にかかる時間よりも大きいことを確認してください

config/queue.phpファイル

    'connections' => [

    'sync' => [
        'driver' => 'sync',
    ],

    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 9000,
    ],
0
Yasser