스프링
마이크로서비스 코딩
공작소
2019.05.25
Chapter 5.
나쁜 상황에 대비한 스프링 클라우드와
넷플릭스 히스트릭스의 클라이언트 회복성 패턴
발견하기 어려운 시스템 장애의 특징
- 서비스 저하는 간헐적으로 발생하고 확산될 수 있다.
- 원격 서비스호출은 대개 동기식이며 오래 걸리는 호출을 중단하지 않음
- 애플리케이션은 대개 부분적인 저하가 아닌 원격 자원의 완전한 장애를 처리하도록 설계
5.1 클라이언트 회복성 패턴이란
클라이언트의 회복성을 위한 소프트웨어 패턴은 원격 서비스가 에러를 던지거나 제대로 동작하지 못해 원격 자원의 접근이 실패할 때, 원격 자원을 호출하는 클라이언트 충돌을 막는 데 집중.
- 클라이언트 측 부하 분산
- 회로 차단기(circuit breaker)
- 폴백(fallback)
- 벌크헤드(bulkhead)
클라이언트 회복성 패턴
5.1.1 클라이언트 측 부하 분산
클라이언트가 넷플릭스 유레카 같은 서비스 디스커버리 에이전트를 이용해 서비스의 모든 인스턴스를 검색한 후 해당 서비스 인스턴스의 실제 위치를 캐싱 하는 것
5.1.2 회로 차단기
원격 자원에 대한 모든 호출을 모니터링하고, 호출이 필요한 만큼 실패하면 회로 차단기가 활성화되어 빨리 실패하게 만들며, 고장 난 원격 자원은 더 이상 호출되지 않도록 차단한다.
5.1.3 폴백 처리
원격 서비스에 대한 호출이 실패할 때 예외를 발생시키지 않고 서비스 소비자가 대체 코드 경로를 실행해 다른 방법으로 작업을 수행
5.1.4 벌크헤드
원격 자원에 대한 호출을 자원별 스레드 풀로 분리하므로 특정 원격 자원의 호출이 느려져 전체 애플리케이션이 다운될 수 있는 위험 감소
5.2 클라이언트 회복성이 중요한 이유
회로 차단 패턴의 기능
- 빠른 실패: 원격 서비스가 저하를 겪으면 애플리케이션은 빨리 실패함으로써 애플리케이션 전체를 다운 시킬 수 있는 자원 고갈 이슈 방지
- 원만한 실패: 타임아웃과 빠른 실패 방법을 사용하는 회로 차단기 패턴으로 애플리케이션 개발자는 원만하게 실패하거나 사용 의도로 수행하는 대체 메커니즘을 찾을 수 있다
- 원활한 회복: 회로 차단기 패턴이 중개자 역할을 한다면 회로 차단기는 요청 자원이 온라인 상태인지 주기적으로 확인하고, 사람의 개입 없이 자원 접근을 다시 허용할 수 있다
5.9 스레드 컨텍스트와 히스트릭스
격리 전략
- THREAD(default) : 호출을 보호하는 데 사용된 모드 히스트릭스 명령은 호출을 시도한 부모 스레드와 컨텍스트를 공유하지 않는 격리된 스레드 풀에서 수행 - 히스트릭스 명령 스레드와 부모 스레드 사이에 격리 수준 높음
- SEMAPHORE: 새로운 스레드를 시작하지 않고 @HystrixCommand 애너테이션이 보호하는 분산 호출을 관리하며 타임아웃 발생 시 부모 스레드 중단 - 경량이므로 대용량 처리, 비동기 I/O 프로그래밍에 사용
5.9 스레드 컨텍스트와 히스트릭스
HystrixConcurrencyStrategy
히스트릭스와 스프링 클라우드는 부모 스레드의 컨텍스트를 히스트릭스 스레드 풀이 관리하는 스레드에 전달하는 메커니즘
5.9 스레드 컨텍스트와 히스트릭스
HystrixConcurrencyStrategy 동작
- 히스트릭스 병행성 전략 클래스를 사용자 정의
- 히스트릭스 명령에 UserContext를 주입하도록 자바 Callable 클래스 정의
- 히스트릭스 병행성 전략을 사용자 정의하기 위해 스프링 클라우드 구성
나쁜 상황에 대비한 스프링 클라우드와 넷플릭스 히스트릭스의 클라이언트 회복성 패턴
By Sungbin, Song
나쁜 상황에 대비한 스프링 클라우드와 넷플릭스 히스트릭스의 클라이언트 회복성 패턴
- 142