Hystrix
-
В распределенных системах Hystrix позволяет реализовать некоторые стратегии для повышения устойчивости системы к задержкам и сбоям, которые могут возникать между сервисами. Это достигается за счет изоляции точек доступа между службами, прекращения каскадных сбоев между ними и предоставления вариантов возврата, повышая общую отказоустойчивость.
-
Когда возникает нежелательная ситуация, контроль этой ситуации как можно быстрее, прежде чем она вызовет другие ситуации в цепочке, направлен на то, чтобы обнаружить и восстановить ситуацию как можно быстрее, и эта тенденция последовательного контроля обеспечивает возможность мониторинга практически в реальном времени.
-
В распределенной архитектуре существует множество зависимостей, и на каком-то этапе они обязательно дадут сбой. Hystrix стремится к «свободному соединению», создавая изоляцию между этими зависимостями.
https://github.com/Netflix/Hystrix
Например, в приложении, состоящем из 10 сервисов, каждый из которых имеет 99,99% времени безотказной работы,
99.9910 = 99,9% времени безотказной работы
0,3% от 1 миллиарда запросов = 3 000 000 отказов
2+ часа простоя/месяц, даже если все зависимые системы имеют отличное время работы.
- Задержка любой сторонней зависимости начнет использовать все ресурсы системы с возрастающим спросом, вызывая общесистемный сбой.
Включенные принципы проектирования
- Чтобы зависимость не доминировала в использовании ресурсов.
- Как можно быстрее привести систему в состояние отказа, создать ответную реакцию и избавиться от нагрузки.
- Защита пользователя путем реализации логики отката в наиболее подходящем месте в случае сбоя.
- Снижение зависимости с помощью различных методов изоляции (переборка, плавательная дорожка и автоматический выключатель).
- Оптимизация обнаружения и восстановления неисправностей.
Как она реализуется?
-
Обертывание всех вызовов внешних систем (или «зависимостей») в объект HystrixCommand или HystrixObservableCommand, обычно выполняемый в отдельном потоке (в этом отношении он похож на паттерн Command).
-
Когда ответ на запрос задерживается, срабатывает тайм-аут, если задержка превышает определенный порог.
-
Для каждой зависимости создается пул потоков, и если этот пул заполнен входящими запросами, запрос немедленно отклоняется, предотвращая ненужное ожидание и трату ресурсов.
-
Если процент ошибок службы превышает пороговое значение, используется автоматический выключатель для ручной или автоматической остановки всех запросов на определенную службу на определенный период времени.
-
Реализация логики, которой необходимо следовать в случае возможных неисправностей в структурах, оборачивающих звонки, позволяет создать надежную и полезную систему.
Переборка
- Создавая пул потоков для каждого типа запросов, он не позволяет одному типу запросов использовать все ресурсы и задерживать другие запросы.
Автоматический выключатель
-
В пуле потоков, если количество запросов и соотношение размера пула потоков увеличивается выше определенного порога, соединение с сервисом разрывается (circuit-open), чтобы на запросы отвечали немедленно и предотвратить задержку.
-
Та же логика может быть применена к запросам с ошибками, а не к отложенным ответам. При возникновении ошибки выше определенного значения соединение разрывается, предотвращая возникновение большого количества ошибок и создавая возможность предпринять необходимые действия.
@SyncCallLogger
@Override
@HystrixCommand(fallbackMethod = "sorgulaTahakkukFallbackMethod",
commandProperties = {@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE")})
public GumrukEttnSorgulaResponseDTO sorgulaTahakkukGumrukten(GumrukEttnSorgulaRequestDTO gumrukEttnSorgulaRequestDTO) {
return restTemplate.postForObject(gumrukConfiguration.getMaliyews().getSorgulaTahakkuk(), gumrukEttnSorgulaRequestDTO, GumrukEttnSorgulaResponseDTO.class);
}
Это хорошее решение для предотвращения ненужных операций на системах Hytrix, но поскольку оно больше не поддерживается, возможно, что вскоре оно будет отставать от своих аналогов и не сможет выполнять требования. Это следует учитывать в случае использования.