Предохранитель
Условие
createBreaker(fn, { threshold, cooldown }): после threshold подряд ошибок переходит в открытое состояние и cooldown миллисекунд отказывает сразу, не вызывая fn. После остывания даёт одну пробную попытку: успех - закрыт, ошибка - снова открыт. Поле state отдаёт 'closed' / 'open' / 'half-open'.
Что проверяют тесты
пропускает успешные вызовы
размыкается после порога
после остывания - пробная попытка
неудачная проба снова размыкает
успех сбрасывает счётчик
Как подойти
Предохранитель защищает падающий сервис от добивания: вместо тысячи запросов в секунду он получает один пробный после паузы. Ключевая деталь реализации - состояние вычисляется лениво при обращении, а не по таймеру: иначе придётся держать живой таймер и чистить его. Пара к нему - повтор с нарастающей паузой: повтор борется со случайными сбоями, предохранитель - с системными.
Подсказки: 3
- Три состояния и переходы между ними - это конечный автомат.
- Переход из открытого в полуоткрытое происходит по времени, а не по событию - вычисляй его при обращении.
- Одна ошибка в полуоткрытом состоянии сразу размыкает снова.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.