Длительные задержки
Workflow можно приостановить на заданное время между шагами с помощью метода конструктора delay(). Шаги задержки надежно сохраняются: задержка записывается в базу данных, поэтому она переживает перезапуск worker, развертывание и перезагрузку сервера.
Метод ->delay()
Добавьте шаг задержки в любое место цепочки workflow:
use Queuety\Queuety;
Queuety::workflow( 'drip_campaign' )
->then( SendWelcomeEmailHandler::class )
->delay( days: 1 )
->then( SendFollowUpEmailHandler::class )
->delay( days: 3 )
->then( SendFinalEmailHandler::class )
->dispatch( [ 'user_id' => 42 ] );
Workflow выполнит следующее:
- Выполнит
SendWelcomeEmailHandler - Подождет 1 день
- Выполнит
SendFollowUpEmailHandler - Подождет 3 дня
- Выполнит
SendFinalEmailHandler
Параметры длительности
Метод delay() принимает любое сочетание именованных параметров длительности:
| Параметр | Тип | Описание |
|---|---|---|
$seconds |
int |
Секунды ожидания |
$minutes |
int |
Минуты ожидания |
$hours |
int |
Часы ожидания |
$days |
int |
Дни ожидания |
Значения суммируются. Эти варианты эквивалентны:
->delay( seconds: 3600 )
->delay( minutes: 60 )
->delay( hours: 1 )
Их можно сочетать:
->delay( hours: 1, minutes: 30 ) // 90 minutes total
Как работают шаги задержки
Когда workflow доходит до шага задержки, Queuety запускает внутреннее задание __queuety_delay, для которого в столбце available_at указано текущее время плюс длительность задержки. Задание хранится в базе данных, и ни один worker не забирает его, пока задержка не истечет.
Это означает, что:
- Без опроса. Workers не проверяют задержку снова и снова. Задание просто становится доступным, когда наступает нужное время.
- Без использования памяти. Во время ожидания ничего не выполняется. Задержка существует только в виде строки базы данных.
- Переживает перезапуски. Даже после перезапуска worker задание задержки остается в очереди с правильной меткой времени
available_at.
Когда задание задержки забирают по истечении задержки, workflow автоматически переходит к следующему шагу.
Пример: уведомления с задержкой
Отправьте напоминание через 1 час после регистрации пользователя, но только если он еще не завершил вводный процесс:
Queuety::workflow( 'onboarding_reminder' )
->then( CreateAccountHandler::class )
->delay( hours: 1 )
->then( CheckOnboardingHandler::class )
->then( SendReminderHandler::class )
->dispatch( [ 'email' => 'user@example.com' ] );
Шаг CheckOnboardingHandler может проверить состояние и использовать условное ветвление, чтобы пропустить напоминание, если вводный процесс уже завершен.
Пример: повтор с увеличением задержки
Добавьте намеренные задержки между шагами, похожими на повторные попытки:
Queuety::workflow( 'poll_external_api' )
->then( CheckStatusHandler::class, 'check' )
->delay( minutes: 5 )
->then( CheckStatusHandler::class, 'recheck' )
->delay( minutes: 15 )
->then( CheckStatusHandler::class, 'final_check' )
->then( ProcessResultHandler::class )
->dispatch( [ 'external_id' => 'abc-123' ] );
Несколько задержек
Workflow может содержать любое количество шагов задержки. Каждая задержка независима и отслеживается в состоянии workflow по последовательному имени (delay_0, delay_1 и т. д.).
Queuety::workflow( 'multi_step_drip' )
->then( StepA::class )
->delay( hours: 2 )
->then( StepB::class )
->delay( days: 1 )
->then( StepC::class )
->delay( minutes: 30 )
->then( StepD::class )
->dispatch( $payload );