Проверяет понимание паттерна Circuit Breaker для обеспечения отказоустойчивости распределённых систем.
Circuit Breaker (автоматический выключатель) — это паттерн проектирования, используемый в распределённых системах для повышения отказоустойчивости. Он защищает систему от каскадных отказов, когда один неисправный сервис перегружает другие, вызывая цепную реакцию. Вместо того чтобы бесконечно ждать ответа от проблемного сервиса, Circuit Breaker быстро отклоняет запросы, позволяя системе продолжать работу с использованием запасных вариантов.
Паттерн имеет три состояния: Closed (закрыт), Open (открыт) и Half-Open (полуоткрыт). В закрытом состоянии все запросы проходят к сервису. Если количество ошибок превышает заданный порог (например, 5 ошибок за 10 секунд), цепь размыкается. В открытом состоянии запросы мгновенно отклоняются без обращения к сервису, часто с возвратом fallback-ответа. Через определённый таймаут цепь переходит в полуоткрытое состояние, пропуская ограниченное количество пробных запросов. Если они успешны, цепь закрывается; если нет — снова открывается.
class CircuitBreaker {
constructor(request, options = {}) {
this.request = request;
this.failureThreshold = options.failureThreshold || 5;
this.timeout = options.timeout || 10000;
this.failures = 0;
this.state = 'CLOSED';
this.nextAttempt = Date.now();
}
async call(...args) {
if (this.state === 'OPEN') {
if (Date.now() > this.nextAttempt) {
this.state = 'HALF_OPEN';
} else {
throw new Error('Circuit is open');
}
}
try {
const result = await this.request(...args);
this.reset();
return result;
} catch (err) {
this.failures++;
if (this.failures >= this.failureThreshold) {
this.state = 'OPEN';
this.nextAttempt = Date.now() + this.timeout;
}
throw err;
}
}
reset() {
this.failures = 0;
this.state = 'CLOSED';
}
}Circuit Breaker широко используется в микросервисных архитектурах, при интеграции с внешними API, базами данных и другими зависимыми сервисами. Библиотеки, такие как Hystrix (Java), resilience4j (Java), Polly (.NET) и opossum (Node.js), предоставляют готовые реализации. Паттерн особенно полезен в системах с высоким трафиком, где даже короткие задержки могут привести к исчерпанию ресурсов.
Применяйте Circuit Breaker, когда ваша система зависит от внешних сервисов и вы хотите избежать каскадных сбоев. Он позволяет быстро отклонять запросы к неисправным компонентам, сохраняя общую доступность и давая время на восстановление.