Типовий випадок: імпорт оновлює товар 20 разів за хвилину, і кожне ProductUpdated перебудовує пошуковий індекс.
Дебаунс (Laravel 13) - обробити лише останню подію за проміжок:
#[DebounceFor(30)]
class UpdateProductSearchIndex implements ShouldQueue
{
public function debounceId(ProductUpdated $event): string
{
return (string) $event->product->getKey();
}
public function handle(ProductUpdated $event): void { /* ... */ }
}
Кожна нова подія з тим самим debounceId скидає таймер; виконується лише остання, через 30 секунд тиші.
Унікальний слухач - не ставити в чергу дубль, поки попередній не оброблений:
class AcquireProductKey implements ShouldQueue, ShouldBeUnique
{
public function uniqueId(LicenseSaved $event): string
{
return (string) $event->license->id;
}
}
Різниця: дебаунс чекає, доки події вщухнуть, і обробляє останню. Унікальність обробляє першу, а повтори відкидає, поки вона в черзі.
Інші підходи:
- подію на рівні пачки:
ProductsImportedодин раз замість тисячіProductUpdated; Event::defer()чиModel::withoutEvents()навколо масових операцій.
Обидва механізми потребують драйвера кешу з атомарними блокуваннями.