Це два різні механізми, і їх неправильне поєднання дає подвійне виконання.
--timeout(або#[Timeout]на завданні) - скільки воркер дозволяє завданню працювати, перш ніж убити процес. За замовчуванням 60 секунд.retry_afterуconfig/queue.php- через скільки секунд підключення вважає завдання загубленим і віддає його іншому воркеру.
Що буде, якщо retry_after менший за реальну тривалість: завдання на 120 секунд при retry_after = 90 на 91-й секунді отримає другий воркер. Перше ще працює - і тепер їх два.
Правило: --timeout має бути на кілька секунд меншим за retry_after. Тоді зависле завдання гарантовано вбивається до того, як його повторять.
Для довгих завдань:
- Підняти обидва значення для окремого підключення чи черги з довгими завданнями, не чіпаючи решту.
- Краще - розбити роботу на частини (
Bus::batch), щоб кожне завдання вкладалося в хвилину. #[FailOnTimeout]позначає завдання невдалим після таймауту замість повторів - для операцій, які небезпечно повторювати наосліп.
У SQS замість retry_after діє visibility timeout черги, і правило те саме.