Многие разработчики используют очереди не по назначению. Чаще всего — чтобы исправить проблемы с медленными приложениями и перегрузкой. Представьте систему как большую раковину: вода течёт из крана (входные данные) в слив (выход). В норме всё справляется. При временной перегрузке — например, во время спортивных событий или выборов — можно поставить ведро (очередь), чтобы накопить лишнюю воду. Но когда перегрузка становится постоянной, ведро переполняется, и система падает. Разработчики начинают оптимизировать каждый компонент, покупают более мощный сервер, но проблема возвращается.
Причина — жёсткий лимит (hard limit): база данных, внешний API, пропускная способность диска или CPU. Вы оптимизировали всё, но не учли этот лимит. Как только пропускная способность системы превысила лимит, вы обречены на бесконечные сбои. Настоящее решение — выбрать, что должно сдаться: либо блокировать вход (back-pressure), либо сбрасывать данные (load-shedding). В реальном мире это делают везде: вышибала в клубе, водосбросы на плотине, клапан в бензобаке. В софте же боятся признать неудачу и вместо этого ставят очередь.
Очередь даёт мгновенный эффект: приложение снова быстрое. Но рано или поздно очередь переполняется, и вы теряете все данные. Добавление новых воркеров, персистентность, дополнительные очереди — всё это лишь откладывает крах. Вы нарушаете end-to-end принцип, используя очередь как fire-and-forget. В итоге отказы становятся реже, но их масштаб катастрофичен.
Правильный подход: найти узкое место и поставить перед ним механизм обратного давления. Тогда система не будет тормозить — она просто ограничит приём данных. Вы получаете измеримые метрики качества, дизайн API с учётом перегрузки, меньше ночных инцидентов и более надёжный endpoint для клиентов. При этом нужна идемпотентность и поддержка повторных запросов.
Конечно, очереди оправданы как механизм обмена сообщениями между потоками в языках без IPC — PHP, Ruby, CGI. Это лучше, чем использовать таблицу MySQL. Но в остальных случаях они — просто плохая инженерия: попытка протолкнуть 18-колёсный грузовик через соломинку, где очередь лишь маскирует настоящую проблему.