Как работает типичный поток кэша:
-
Получен запрос с ключом K.
-
Проверьте кэш:
- попадание в кэш → быстро возвращаем значение;
- TTL/инвалидация контролирует актуальность данных.
Какая проблема возникает при параллелизме:
Во время cache miss популярный ключ может получать множество запросов одновременно. Без дополнительного контроля они все параллельно пойдут на бэкенд — это cache stampede (гремящее стадо).
Что делает singleflight.Group:
-
Дедупликация одновременных идентичных запросов по ключу.
-
Только первый запрос выполняет "дорогую" функцию.
-
Другие конкурирующие запросы ожидают и получают тот же результат.
Какую проблему это решает:
-
Значительно сокращает количество дублирующихся запросов к БД/API при промахе.
-
Стабилизирует задержку при пиковой нагрузке.
-
Защищает серверную часть от скачков напряжения во время массовых одновременных обращений.
Важные практики:
-
Используйте singleflight с кешем, а не вместо кеша.
-
Ограничьте время ожидания с помощью context/timeout.
-
Аккуратно работать с ошибками (чтобы не воспроизвести transient-failing).
-
Добавьте джиттер в TTL, чтобы избежать одновременного мигания нескольких клавиш.
Заключение:
Итог