Сторонній API - найменш контрольована частина системи: він буває повільним, недоступним, обмежує частоту запитів. Якщо викликати його прямо в обробнику запиту користувача, всі його проблеми стають вашими.
Що відбувається без черги:
public function store(Request $request)
{
$order = Order::create($request->validated());
Http::post('https://crm.example.com/api/deals', [...]); // 8 секунд...
Http::post('https://sms.example.com/send', [...]); // ...і впав з 503
return redirect()->route('orders.show', $order);
}
- користувач чекає, поки відповідять усі сторонні сервіси;
- падіння CRM ламає оформлення замовлення, хоча замовлення вже створене;
- процеси PHP-FPM зайняті очікуванням мережі - під навантаженням вони закінчуються, і сайт гальмує повністю;
- повторити невдалий виклик ніхто не спробує.
З чергою:
public function store(Request $request)
{
$order = Order::create($request->validated());
SyncOrderToCrm::dispatch($order)->afterCommit();
SendOrderSms::dispatch($order)->afterCommit();
return redirect()->route('orders.show', $order);
}
Що дає черга:
- швидка відповідь користувачу незалежно від сторонніх сервісів;
- повторні спроби з затримкою (
$tries,backoff()) - тимчасові збої вирішуються самі; - ізоляція: окрема черга для інтеграцій з власними воркерами - повільний провайдер не затримує листи чи генерацію звітів;
- обмеження частоти через middleware джоби (
RateLimited,ThrottlesExceptions) - під ліміти провайдера; - видимість: невдалі джоби в
failed_jobsчи Horizon, їх можна повторити вручну.
afterCommit() - джоба потрапить у чергу лише після коміту транзакції. Інакше воркер може взяти її раніше, ніж замовлення з'явиться в базі.
Коли синхронний виклик виправданий: результат потрібен одразу для відповіді (перевірка адреси доставки, розрахунок вартості, ініціалізація оплати з перенаправленням). Тоді - короткий тайм-аут і зрозуміле повідомлення користувачу при збої.
Джоба має бути ідемпотентною: повтор не повинен створити в CRM дві угоди. Зберігайте зовнішній ідентифікатор після першого успішного виклику і перевіряйте його перед створенням.