В мире разработки программного обеспечения создание отказоустойчивых и высокодоступных систем имеет первостепенное значение. Двумя популярными стратегиями достижения устойчивости являются схема переборки и автоматический выключатель. Оба шаблона направлены на изоляцию и обработку сбоев в распределенных системах, но они различаются подходом. В этой статье мы подробно рассмотрим эти шаблоны и предоставим примеры кода, иллюстрирующие их реализацию. Давайте погрузимся!
- Шаблон переборок:
Шаблон переборок назван в честь концепции переборок на кораблях, которые делят корабль на отдельные водонепроницаемые отсеки, чтобы предотвратить затопление всего корабля в случае прорыва. При разработке программного обеспечения шаблон Bulkhead применяется путем разделения компонентов системы на отдельные пулы, каждый из которых имеет свои собственные ресурсы и ограничения. Такая изоляция предотвращает влияние сбоев в одном компоненте на всю систему.
Пример:
ExecutorService threadPool = Executors.newFixedThreadPool(10);
ThreadPoolExecutor bulkheadExecutor = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
bulkheadExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// Execute task within the bulkhead
bulkheadExecutor.execute(() -> {
// Perform the task
});
- Автоматический выключатель:
Шаблон автоматического выключателя вдохновлен электрическими автоматическими выключателями, которые защищают электрические цепи от повреждений, вызванных чрезмерным током. В программных системах шаблон «Выключатель» направлен на предотвращение каскадных сбоев, обеспечивая механизм быстрого отказа. Он контролирует доступность службы и размыкает канал в случае сбоя службы, перенаправляя запросы на резервный механизм.
Пример:
CircuitBreaker circuitBreaker = CircuitBreaker.create()
.maximumFailures(3)
.waitDurationInOpenState(Duration.ofSeconds(10))
.build();
try {
circuitBreaker.run(() -> {
// Call the remote service
});
} catch (CircuitBreakerOpenException ex) {
// Fallback logic
}
- Шаблон повтора:
Хотя шаблон повтора прямо не упоминается в вопросе, его стоит рассмотреть в контексте устойчивости. Он позволяет автоматически повторять неудачные операции, что может быть полезно в сценариях, где ожидаются временные сбои.
Пример:
RetryConfig config = RetryConfig.custom()
.maxAttempts(3)
.waitDuration(Duration.ofMillis(500))
.retryOnResult(response -> response.getStatus() >= 500)
.build();
RetryRegistry registry = RetryRegistry.of(config);
Retry retry = registry.retry("my-retry");
Supplier<Response> operation = () -> {
// Perform the operation
};
Response response = retry.executeSupplier(operation);
В этой статье мы обсудили шаблон «Переборка», шаблон «Выключатель» и шаблон повтора как стратегии достижения устойчивости при разработке программного обеспечения. Каждый шаблон предлагает уникальные преимущества, и его следует выбирать с учетом конкретных требований системы. Реализуя эти шаблоны, разработчики могут создавать устойчивые и надежные системы, способные корректно обрабатывать сбои.