Воркер queue:work завантажує застосунок один раз і тримає його в пам'яті. Після деплою він продовжує виконувати старий код, поки його не перезапустити.
Перезапуск:
php artisan queue:restart # звичайні воркери
php artisan horizon:terminate # якщо черги веде Horizon
Обидві команди просять воркери завершити поточне завдання й вийти, а Supervisor піднімає їх уже з новим кодом. queue:restart передає сигнал через кеш, тож усі сервери мають бачити спільне сховище кешу.
Що ламається тихіше - сумісність payload. У черзі можуть лежати завдання, серіалізовані старою версією класу:
- Перейменували чи видалили клас завдання - старі завдання впадуть, бо класу немає.
- Додали обов'язковий параметр конструктора - десеріалізоване старе завдання не матиме властивості.
Як робити безпечно:
- Зміни завдань - у два кроки: спершу код, що розуміє і старий, і новий формат, і лише після того, як черга спорожніє, прибрати старе.
- Для перейменування - залишити старий клас-обгортку, що делегує новому, на один реліз.
- Перед ризиковим деплоєм можна призупинити чергу (
queue:pause), дати воркерам добити поточні завдання й поновити після.