Код Senior Асинхронные паттерны обновлено

singleFlight: склейка одинаковых запросов

Условие

Напиши singleFlight(fn): возвращает функцию (key) => Promise. Если для key уже идёт вызов, новый вызов не запускает fn(key) повторно, а получает тот же промис. Когда вызов завершился (успешно или с ошибкой), ключ освобождается, и следующий вызов снова идёт в fn.

Так защищают базу от «лавины» (cache stampede): 1000 запросов за одним остывшим ключом кеша превращаются в один запрос к БД.

Что проверяют тесты

  • параллельные вызовы с одним ключом: один вызов fn

  • разные ключи не склеиваются

  • после завершения ключ свободен

  • ошибка достаётся всем и освобождает ключ

  • синхронный throw в fn не ломает обёртку

Как подойти

Подсказки: 2
  1. Map<key, Promise> с вызовами «в полёте».
  2. Удаляй ключ в finally, иначе ошибка закешируется навсегда.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме