Паттерн 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 Про архитектуру, системное мышление и практики, которые делают системы проще и устойчивее.
· 04.02
так это ж обычная мемоизация, завернутая в пакет и политая соусом )
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 04.02
Можно так сказать, да) но по сути задачи по разному решаются
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 04.02
Ну я первым делом подумал просто кеш запросов.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён