Вирівнювання навантаження чергою - між тим, хто створює роботу, і тим, хто її виконує, ставиться черга. Піки запитів не б'ють напряму по повільній частині системи: вони накопичуються в черзі, а воркери розбирають її з постійною швидкістю.
Приклад: розпродаж - 5000 замовлень за хвилину. Генерація рахунків, листи, синхронізація зі складом і бухгалтерією не встигають. Якщо робити це в запиті - запити повільні, з'єднання з базою вичерпуються, сайт падає. Із чергою:
public function store(StoreOrderRequest $request)
{
$order = Order::create($request->validated());
ProcessOrder::dispatch($order); // секунди роботи - у фоні
return new OrderResource($order); // відповідь за мілісекунди
}
Користувач отримує відповідь одразу, а обробка «розтягується» на кілька хвилин після піку.
Що дає черга:
- швидкі відповіді - у запиті лише необхідне;
- стійкість до збоїв - зовнішній сервіс недоступний, задачі чекають і повторюються;
- незалежне масштабування - воркерів можна додати окремо від вебсерверів;
- захист повільних систем - сторонній API з лімітом отримує запити з контрольованою швидкістю.
Зворотний тиск (backpressure) - механізм, що сповільнює виробника, коли споживач не встигає. Без нього черга росте необмежено: пам'ять Redis закінчується, задачі виконуються з годинною затримкою, і система падає пізніше, але гірше.
Способи зворотного тиску:
- обмеження довжини черги - при переповненні відмовляти (
503) чи сповільнювати прийом; - ліміти частоти на вході - не приймати більше роботи, ніж система може переробити;
- пріоритетні черги - важливе (оплати) окремо від некритичного (аналітика), щоб масова дешева робота не блокувала важливу;
- моніторинг глибини черги й часу очікування - Laravel Horizon показує обидва й може сповіщати (
LongWaitDetected); - автомасштабування воркерів за довжиною черги.
Що варто пам'ятати: черга не прибирає роботу, лише переносить її в часі. Якщо середнє навантаження вище за пропускну здатність воркерів, черга росте вічно - потрібна більша потужність, а не довша черга.
Докладніше в документації: Azure Architecture: Queue-Based Load Leveling