В Laravel 13.26 завезли полезную мелочь для очередей

Laravel выпустил 13.26, и среди изменений мне особенно понравился DebounceFor для queued listeners.
Смысл простой: если одно и то же событие прилетает много раз подряд, можно не запускать пачку почти одинаковых задач, а немного подождать и обработать уже финальное состояние.
Простой пример: в админке несколько раз подряд меняют один и тот же товар — название, цену, описание, потом ещё что-то поправляют. Без такой логики в очередь могут улететь несколько одинаковых обновлений поискового индекса. Хотя по факту нужен только результат последнего изменения.
Что здесь происходит

• DebounceFor(30): Laravel ждёт 30 секунд после последнего события. Если за это время приходит ещё одно такое же событие, отсчёт начинается заново.
• maxWait: 120: ограничивает общее ожидание двумя минутами. Даже если события продолжают сыпаться без остановки, актуальная задача всё равно получит возможность выполниться максимум через 120 секунд с начала этой серии.
• debounceId(): нужен, чтобы Laravel понимал, какие события объединять. В примере используется ID товара, поэтому изменения одного товара группируются вместе, а другого — отдельно.
Разумеется, debounce существовал как концепция задолго до Laravel 13.26.
И при необходимости такую механику никто не мешал написать самостоятельно: кеш, блокировки, таймеры, идентификаторы, обработка граничных случаев. А теперь для типового случая есть понятная встроенная механика.
Не самая громкая фича Laravel 13.26, зато вполне практичная 😉
#разбор #backend #процессы