Запрос к партнёрскому CRM без таймаутов повесил воркеров
Фоновая задача отправляет лид в партнёрский CRM:
$response = $this->http->post('https://crm.partner.example/api/leads', [
'json' => $lead,
// таймауты не заданы
]);
Партнёр начал отвечать за 60+ секунд. Все воркеры очереди оказались заняты, очередь выросла до десятков тысяч задач, отправка писем и уведомлений встала.
Что верно?
- Такие вызовы нужно делать синхронно в HTTP-запросе пользователя: тогда очередь не пострадает, а ожидание увидит только один клиент, который сам решит, повторить ему отправку или отложить
- Достаточно добавить воркеров: очередь разгребётся сама, как только их станет больше, и медленный партнёр перестанет влиять на остальные задачи — это дешевле, чем менять код интеграции
- Любому внешнему вызову задают таймауты на соединение и на чтение, повторы делают ограниченным числом попыток с нарастающей паузой, а падающую интеграцию изолируют в отдельную очередь
- Повторять запрос нужно немедленно и без пауз, пока партнёр не ответит: иначе лид будет потерян, а сами повторы почти ничего не стоят по ресурсам приложения
