laravel has been attempted too many times or run too long. The job may have previously timed out error fix

Updated on

음냐음냐..

laravel has been attempted too many times or run too long. The job may have previously timed out

에러가 발생했다 !

뭐,, 이리저리 다 찾아보고.. 다 해봤지만 해결이 안됬고, 원인을 찾고보니. 90초 후에 저렇게 떴다, 하지만 Queue는 정상적으로 처리 !

와,, 도대체 로그에 쓸데없이 쌓이는건가? 왜지??? 싶어 계속 찾아보았다..
나는 Queue 작업이 생각보다 3~5분 동안 진행되는 작업이였고,

구글링 해본 결과 redis 로 바뀌면 해결된다 해서, 큐를 redis로 바꾸어보았다.

하지만, 여전히 발생하는 것 !

https://divinglaravel.com/prevent-your-queued-jobs-from-duplicating

그 이후에 찾은거긴 하지만, 저 위 메세지가 뜨는 이유는 딱 하나다.

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => env('REDIS_QUEUE', 'default'),
            'retry_after' => 90,
            'block_for' => null,
            'after_commit' => false,
        ],

위 config/queue.php 에서 redis retry_after 이 90으로 되어 있을텐데.

(아 ~ 또 이미지 안올라가,,, 워드프레스 권한문제 어떠케하누)
바로 여기서,, 생기는 문제가 이것이다.. redis 에서 queues:default:reserved를 받았을때 score, 즉 만료시간이 90초가 된다는 의미이다.

즉, redis에 queue가 reserved 되어 올라갈때, 최종 만료시간이 90초 (무조건 고정인듯, queue.php 에 설정한 값 retry_after 그대로…

https://laravel.kr/docs/7.x/queues#%EC%8B%A4%ED%8C%A8%ED%95%9C%20Job%20%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0

그래서 찾아보니, 7버젼대에는 이런것이 있고.

8버젼대에는

https://laravel.com/docs/8.x/queues#throttling-exceptions

로 바뀌긴 한거 같지만..

어쨌든 위 두 값을 백날 설정해봐야, redis queue.php 에 설정한 retry_after 값보다 낮다면, 문제가 생긴다는거다.

위 두 옵션 값이나, queue를 실행할때 사용하는 timeout 값보다 무조건 retry_after 값이 크게 설정을 해놔야 한다.

queue를 사용하면서 이제까지 이거 하나 몰랐다니,, 나원…

또한… 굳이 retry_after 를 설정하지 않고, 각 queue마다 timeout이 모두 다를텐데… 각 queue마다 retry_after 를 설정할 수는 없는걸까 ? 흐음… 분명 있는것 같으면서도 없는것 같기도하고… 더 찾아보면 나올지도 모르겠지만, 구글링 해본 결과 없는것? 같기도 하다…

그래서 나는 queue:work 에 –timeout 1800 옵션을 주기 때문에,
queue.php redis 의 retry_after 값을 1860으로 수정해주었다…