Выбор ответа Senior Паттерны конкурентности обновлено

singleflight и лавина на кеш

Вопрос

Популярный ключ кеша истёк, и 1000 запросов одновременно идут в базу за одним и тем же. Какой пакет решает эту проблему внутри одного процесса?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: singleflight: вызовы с одним ключом ждут одно выполнение. singleflight.Group.Do(key, fn) выполняет fn один раз для группы одновременных вызовов с одинаковым ключом, остальные получают тот же результат (с флагом shared).

Варианты ответа

  1. sync.Once: первый вызов идёт в базу, остальные ждут его ответ
  2. singleflight: вызовы с одним ключом ждут одно выполнениеправильный ответ
  3. sync.Pool: пул переиспользует результат запроса к базе
  4. errgroup: группа ограничит число одинаковых запросов

Разбор

singleflight.Group.Do(key, fn) выполняет fn один раз для группы одновременных вызовов с одинаковым ключом, остальные получают тот же результат (с флагом shared). Once выполняется один раз за всю жизнь, а нужно один раз на каждый промах. Pool про переиспользование объектов. errgroup про ожидание задач. Между инстансами сервиса нужна ещё распределённая защита: ранний пересчёт, блокировка в Redis, джиттер TTL.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.