singleFlight: склейка одинаковых запросов
Условие
Напиши singleFlight(fn): возвращает функцию (key) => Promise. Если для key уже идёт вызов, новый вызов не запускает fn(key) повторно, а получает тот же промис. Когда вызов завершился (успешно или с ошибкой), ключ освобождается, и следующий вызов снова идёт в fn.
Так защищают базу от «лавины» (cache stampede): 1000 запросов за одним остывшим ключом кеша превращаются в один запрос к БД.
Что проверяют тесты
параллельные вызовы с одним ключом: один вызов fn
разные ключи не склеиваются
после завершения ключ свободен
ошибка достаётся всем и освобождает ключ
синхронный throw в fn не ломает обёртку
Как подойти
Подсказки: 2
Map<key, Promise>с вызовами «в полёте».- Удаляй ключ в
finally, иначе ошибка закешируется навсегда.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Семафор для ограничения доступа к ресурсу
Следующий вопрос
withTimeout: дедлайн для промиса