본문 바로가기

Dev/기타

Armeria의 서킷 브레이커

** 서킷 브레이커 ?
- 하나의 원격 서버에서 발생한 장애가 계속 전파되어 모든 시스템에 큰 영향을 주는 문제의 해결책이다.
- 네트워크 이슈, 서버 다운 등 예상치 못한 장애가 발생하여 어떤 원격 서버 하나가 요청에 대한 응답을 하지 못할 때, 클라이언트는 타임아웃이 발생할 때까지 기다리거나 계속해서 요청을 보내 자원을 낭비된다.


** 서킷 브레이커의 상태 ?

1) closed : 정상 - 요청의 실패율이 정해 놓은 임계치보다 낮음
2) open : 요청을 전송하지 않고 바로 에러 발생시킴 - 요청의 실패율이 정해 놓은 임계치보다 높음
3) half_open : open 상태에서 주기적으로 요청을 전송하여 응답을 확인하고, 성공하면 closed, 실패하면 open 상태를 유지


** Armeria와 서킷 브레이커 ?
- Armeria(Netty 기반 비동기 마이크로서비스 프레임워크)는 서킷 브레이커 기능을 제공한다. 

** 예시
가정) 서버1, 서버2
1) 클라이언트 to 서버1 요청 : GET /hello
2) 서버1 to 서버2 요청 :  GET /world
3) 서버2 to 서버1 응답 : 200 or 500
4) 서버1 to 클라이언트 응답 : pass

서버2 코드 : 
 200, 500 번갈아 리턴한다.

서버1 코드 : 
 클라이언트의 요청을 받을 서비스, 서버2로 요청을 보낼 클라이언트 모두 빈으로 등록한다. 서버2로 요청을 보낼 때 wbclient를 빈으로 등록하고 서버2로 전송되는 모든 요청에 대해 동일한 webclient 객체를 재사용하도록 구현하고, decorator을 이용해 webclient에 서킷 브레이커를 적용한다.

- counterSlidingWindows(10s) : 10초 간격으로 요청의 성공/실패 수를 측정하여 상태 전환을 결정한다.
- circuitOpenWindow(5s) : open 상태가 되면 5초 동안 외부 서버로 부터 요청을 보내지 않고 바로 에러를 발생시킨다.
- failureRateThreshold(0.3) : 30% 이상으로 요청이 실패하면 open 상태로 전환한다.
- minimumRequestThreshold(5) : 실패율이 failureRateThreshold 보다 높다고 해도, 그 값이 최소 5개 이상의 요청일 때만 open으로 전환한다.
- trailRequestInterval(3s) : half_open 상태로 유지되는 시간이다. 3초 동안은 open 상태처럼 failFastException 을 발생시키키는 한편, 외부 서버로도 요청을 전송하며 서버가 정상적으로 돌아왔는지 확인한다. 3초 동안 요청을 전송하면서 성공 응답을 받으면 closed 상태로 전환한다.

참고 :
https://engineering.linecorp.com/ko/blog/try-armeria-circuit-breaker/
 

'Dev > 기타' 카테고리의 다른 글

[gRPC] 통신 예제  (0) 2022.01.25
[gRPC] 개념 정리  (0) 2022.01.25
VisualVM을 이용한 JVM 모니터링  (0) 2021.08.09
Jib 예제 따라하기  (0) 2021.08.09
Spark 성능 테스트  (0) 2021.08.09