면접 때 서킷 브레이커, 마이크로서비스 관리를 물어봤던 이유가 있다. 정말 많이 쓰고 있다.
얘가 뭐임?
기본적으로 Fault Tolerance(장애 허용) 시스템이다.
일정 부분에 장애가 발생해도, 다른 부분들은 문제 없이 굴러가도록 지원해주는 장치로 볼 수 있다.
마이크로서비스가 대두되면서, 하나의 API가 박살나도 다른 쪽이 멀쩡하게 작동할 수 있도록 하는 방안이 필요한데,
Resilience4j는 이런 측면에서 6가지 핵심 모듈을 제공한다.
- CircuitBreaker: 특정 서비스에서 일정 횟수 이상의 에러/타임아웃이 발생한다면 해당 서비스 접근을 아예 차단하고 즉시 실패 반환
- Bulkhead: 요청을 격리하여 다른 서비스에 영향을 가지 않도록 함
- RateLimiter: 요청의 양을 조절
- Retry: 요청 실패시 재시도 기능
- TimeLimiter: 시간 제한
- Cache: 캐시 사용
어떻게 작동함?
- CircuitBreaker
- {최소요청횟수 n회}, {timeout m ms} 기준으로 {최근 k초동안} {실패율 x%} 이상이면 {Circuit Breaker 지속시간을 y초} 유지한다.
- 최근에 실패가 많으면 몇초간 차단하고, 그 뒤는 유예기간으로 지켜본다.
- Bulkhead
- 쓰레드 내 동시 호출을 제한하여 격리함
- 리모트 서비스에 연결할 때(ex. DB 연결) 해당 서비스에 연결할 수 있는 쓰레드 수에 제한을 둔다든지 하여 리모트 서비스에 문제가 생기더라도 그 서비스에 모든 쓰레드를 뺏기는 일이 없도록 격리할 수 있음.
- 세마포로 막을지 쓰레드풀로 막을지 설정 가능
- MaxConcurrentCalls, maxWaitDuration 제한 등으로 세마포 설정
- 풀사이즈, 큐사이즈 등으로 쓰레드풀 설정
- 쓰레드 내 동시 호출을 제한하여 격리함
- RateLimiter
- 일정 시간동안 들어오는 작업량 제한
- TimeLimiter
- 응답에 대한 Timeout과 관련하여 제한을 걸어둔다.
- 시간에 대한 제한을 걸고 이를 다루기 때문에, CompletableFuture 타입을 다루게 된다. TimeLimiter를 거치면 타입이 변하게 되며, 이것이 제약사항이 되기도 한다.
이게 어케 구현이 가능함?
- 모든 요청을 Resilience4j를 통해 가도록 하면, 모든 요청에 대해 컨트롤이 가능하므로 위 기능들을 사용할 수 있게 된다.
- 모든 메서드에 대해 프록시 패턴을 적용하는 것으로도 생각 가능해보인다.
2023.01.24 - [개발 여행/Java] - [Java] Resilience4j 예시 - CircuitBreaker
[Java] Resilience4j 예시 - CircuitBreaker
2023.01.16 - [개발 여행/Java] - [Java] Resilience4j가 뭐지? [Java] Resilience4j가 뭐지? 면접 때 서킷 브레이커, 마이크로서비스 관리를 물어봤던 이유가 있다. 정말 많이 쓰고 있다. 얘가 뭐임? 기본적으로 Fau
kordaydream.tistory.com
'개발 여행 > Java' 카테고리의 다른 글
[Java] Resilience4j 예시 - CircuitBreaker (0) | 2023.01.24 |
---|---|
[Java] ENUM(열거형 타입) (0) | 2023.01.16 |