Паттерн Singleflight

Singleflight: как не делать одну и ту же работу несколько ра

В распределённых системах есть простая и неприятная реальность: одинаковые запросы часто приходят одновременно.

И если не думать об этом специально, система начинает делать одну и ту же дорогую работу много раз подряд — просто потому что «так получилось».

Паттерн Singleflight решает именно эту проблему.

Простая аналогия

Представьте, что несколько человек одновременно спрашивают вас:

«Сколько будет 123 × 456?»

Без Singleflight Вы честно считаете каждый раз заново. Тратите силы, время и внимание.

С Singleflight Вы говорите: «Я сейчас посчитаю один раз, а вы все получите тот же ответ».

Результат один. Затраты — в разы меньше.

Суть паттерна

Singleflight применяется, когда несколько потоков или запросов пытаются выполнить одинаковую операцию.

Что он делает:

схлопывает параллельные запросы — выполняет операцию один разраздаёт результат всем ожидающим — если произошла ошибка — все получают одну и ту же ошибку

Важно: речь не про кеш «навсегда». Речь про контроль конкурентного выполнения.

Ключевая идея — ключ

Singleflight работает по ключу.

Это не «любые одинаковые запросы», а запросы с одинаковым смыслом.

Примеры ключей: — ID пользователя — URL + параметры — ID сущности — бизнес-идентификатор

Все запросы с одинаковым ключом: — ждут один результат — не запускают дублирующую работу

Как это выглядит в системе

1. Первый запрос с ключом X приходит 2. Операция запускается 3. Остальные запросы с тем же ключом:    — не выполняют работу    — блокируются и ждут 4. Когда операция завершается:    — результат получают все    — блокировка снимается

Никакой магии. Только дисциплина.

Важная особенность: это не кеш

Singleflight часто путают с кешированием. Это разные вещи.

Singleflight: — живёт только во время выполнения операции — не хранит результат после завершения — решает проблему конкурентных запросов

Кеш: — хранит результат — работает во времени — решает проблему повторных обращений

На практике они часто используются вместе, но решают разные задачи.

Где паттерн особенно полезен

Singleflight отлично работает там, где: — тяжёлые запросы к БД — походы во внешние API — прогрев кеша — пересчёт агрегатов — ленивые инициализации

Особенно в пиках нагрузки, когда «шторм одинаковых запросов» может положить систему.

Ограничения и риски

Singleflight — не серебряная пуля.

Важно помнить: — долгие операции = долгие ожидания — ошибка распространяется на всех — ключ должен быть выбран аккуратно

Неправильный ключможет привести к неожиданной блокировке или потере параллелизма.

Вывод

Singleflight — это про уважение к ресурсам.

Он не ускоряет одну операцию. Он убирает бессмысленные повторы.

Если система делает одну и ту же работу много раз одновременно — скорее всего, вам нужен именно этот паттерн.

О канале

👉 https://t.me/manager_dot_exe Про архитектуру, системное мышление и практики, которые делают системы проще и устойчивее.