Post

재시도 전략

API 요청과 재시도

API 요청에 실패하면 어떻게 대응하는 것이 좋을까?

  1. 될때까지 쏘기
  2. 한 10분 있다가 다시 요청하기
  3. 그냥 멍때리기

전부 다 좋은 방법은 아닌 것 같다.

1번 방법 사용 시 API를 제공하는 서버에 지속적으로 부하를 걸어서 장애 복구에 차질이 생기게 할 수 있다. 또한 내 서버도 굉장히 많은 리소스를 낭비하게 된다.

2번 방안은 몇 분 후에 장애 복구될지 누가 알 것인가?

3번으로 대응 시 유저 다 나간다.

이런 상황을 대비해서 나온 이론들과 관련 라이브러리들이 존재했다. 내가 작성한 코드는 비록 외부 상황의 문제더라도 결국 내 책임이니 다양한 장애 상황을 대비해서 공부를 해놓으면 좋을 것 같다는 생각에 글을 작성하게 되었다. 자꾸 무슨 일 난다고 조상님이나 종교 찾지 말자. 그분들 바쁘다.

회로 차단기 (Circuit Breaker)

화면 캡처 2023-07-13 153140

전자 회로 실습을 하던 때를 상상해보자.

우리는 보통 저항 -> LED 소자 순으로 회로를 구성해 과부하를 방지한다. 동일한 전압에서 저항값이 낮을수록 전류가 높아지기 때문인데 회로의 노후화나 접촉 불량 등으로 저항을 거치지 않고 LED로 전력이 바로 공급되는 상황을 보통 단락, 쇼트가 났다고 말한다.

화면 캡처 2023-07-13 153256

만약 과전류가 흐른다면 회로에 전력 공급을 중단해야 하는데, 위 사진과 같이 회로를 개방시켜 전류의 흐름을 막은 상태를 Open된 상태라고 한다. 스위치가 열려있다고 생각하면 편하다. 그러면 반대로 스위치를 눌러서 회로가 연결된 상태는 Closed 라고 한다.

이런 상황을 사람이 계속 감시할 수는 없으니 특정 상태를 감지해서 회로를 정지시키는, 두꺼비집과 같은 장치들을 회로 차단기라고 부른다. 갑자기 왜 회로 이야기를 했나면, 여기서 아이디어를 얻어 나온 디자인 패턴이 서킷 브레이커 패턴이기 때문이다.

서킷 브레이커 패턴

회로를 차단하던 과정을 코드로 옮긴 것이 서킷 브레이커 패턴이다. 해당 패턴에는 3가지의 상태가 존재하는데, 위에서 언급한 Open, Closed 상태를 떠올리면 이해가 쉽다.

  • CLOSED
    • 요청의 실패율이 정해 놓은 임계치보다 낮은 정상적인 상태
    • 스위치가 닫힌 회로, 전류 잘 통하는 중
  • OPEN
    • 요청의 실패율이 정해 놓은 임계치를 넘어선 상태
    • 요청을 전송하지 않고 바로 에러를 발생
    • 스위치가 열린 회로, 전류 공급 차단
  • HALF_OPEN
    • OPEN 상태에서 주기적으로 요청을 전송하여 응답을 확인하는 상태
    • 성공하면 CLOSED 상태로 전환, 실패하면 OPEN 상태를 유지
    • 스위치 열까 다시 닫을까 고민중인 상황

장애 발생 기준은 크게 기준치보다 느린 응답(slow call), 실패한 응답(failure call) 2가지가 존재한다고 하며, 해당 값들이 임계치를 넘을 경우 OPEN 상태로 전환하는 방식이다.

이러한 방식은 빠른 실패 및 고객 응답, 장애 발생 서비스의 부하 감소 등의 효과를 기대할 수 있다. 관련 라이브러리로는 Resilience4J, Armeria, Hystrix 등이 존재하며 Hystrix는 지원을 중단한 상태라고 하니 참고하자.

결론

최근에 어떤 문제만 발생하면 종교에 기댄다는 지인 이야기를 들었다.

몇날 며칠동안 자신의 신을 찾아 울부짖으면 어느새 해결이 되어 있다는 이야기였는데, 문제를 해결해 준 것은 기도하던 신이었을까, 울음소리를 듣던 주변 사람들의 도움이었을까.

항상 성공하는 요청을 신뢰하며 실패할 일 따윈 없다고 생각하면, 믿음이 깨지는 그 순간에는 스스로 대처할 힘이 있을까.

결론은 에러 상황 대비를 잘하자. 뭔 일이 언제 날 지 다 예측 가능하면 미아리고개 점집들은 진작 망했다. 다만 불확실한 미래가 존재한다는 사실은 알고 있으니, 준비 정도는 해보면 좋지 않을까.

참고

  • 망나니개발자, [디자인패턴] 서킷 브레이커 패턴(Circuit Breaker Pattern)의 필요성 및 동작 원리, https://mangkyu.tistory.com/261
  • Line Engineering, Armeria의 서킷 브레이커 사용해 보기, https://engineering.linecorp.com/ko/blog/try-armeria-circuit-breaker
This post is licensed under CC BY 4.0 by the author.

© . Some rights reserved.

Using the Jekyll theme Chirpy