Код Senior Реализация с нуля обновлено

Предохранитель

Условие

createBreaker(fn, { threshold, cooldown }): после threshold подряд ошибок переходит в открытое состояние и cooldown миллисекунд отказывает сразу, не вызывая fn. После остывания даёт одну пробную попытку: успех - закрыт, ошибка - снова открыт. Поле state отдаёт 'closed' / 'open' / 'half-open'.

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

  • пропускает успешные вызовы

  • размыкается после порога

  • после остывания - пробная попытка

  • неудачная проба снова размыкает

  • успех сбрасывает счётчик

Как подойти

Предохранитель защищает падающий сервис от добивания: вместо тысячи запросов в секунду он получает один пробный после паузы. Ключевая деталь реализации - состояние вычисляется лениво при обращении, а не по таймеру: иначе придётся держать живой таймер и чистить его. Пара к нему - повтор с нарастающей паузой: повтор борется со случайными сбоями, предохранитель - с системными.

Подсказки: 3
  1. Три состояния и переходы между ними - это конечный автомат.
  2. Переход из открытого в полуоткрытое происходит по времени, а не по событию - вычисляй его при обращении.
  3. Одна ошибка в полуоткрытом состоянии сразу размыкает снова.

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

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