본문 바로가기
Computer Science/Spring

동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있을까.

by 꽃요미 2024. 12. 10.

* intro

 - 외부 서비스 장애로 인해 응답이 오래 걸린다고 했을 때 외부 API 응답으로 대기하는 자원들이 운영 서버 내부에 쌓이면 성능에 악영향을 줌. 이를 해결하기 위한 가장 기본적인 방법은 time out을 설정하는 것.

 

* HTTP 커넥션 풀이란?

Clientd와 Server간에 지속적으로 유지할 수 있는 HTTP 연결들을 재사용하기 위한 메커니즘 또는 관리 방식입니다. 일반적으로 애플리케이션이 서버와 통신할 때, 매 요청마다 새로운 TCP 연결을 맺고 HTTP 요청을 전송한 뒤, 응답을 받고나서 연결을 종료하는 과정을 반복하면 다음과 같은 비효율이 발생.

 

1. 연결 설정 오버헤드:

TCP 핸드셰이크(3-way handshake), TLS 핸드셰이크(HTTPS의 경우) 등 연결을 맺는 과정은 요청-응답 자체보다 시간이 더 오래 걸릴 수 있습니다. 매번 새로운 연결을 생성하면 해당 과정의 오버헤드가 누적됩니다.

 

2. 리소스 낭비:

빈번한 연결 설정과 해제는 서버와 클라이언트 모두의 자원을 소비합니다. 이는 네트워크 지연(latency)을 증가시키며, 서버의 부하를 높일 수 있습니다.

 

* 결론

따라서 커넥션 풀의 역할은 이러한 비효율을 줄이기 위해 한 번 맺은 TCP/HTTP 연결을 일정 시간 동안 유지하고, 다음 HTTP 요청을 보낼 때 이전에 만들어둔 연결을 재사용하는 것입니다. 이를 통해 다음과 같은 이점이 있습니다.

 

 

 

Time Out 에는 3가지가 존재함

 - 커넥션 타임아웃

 - 리드 타임아웃

 - HTTP 커넥션 풀 타임아웃

 

* 다음과 같이 특성 서비스의 장애가 전체 서비스에 영향을 주는 경우 해결하는 방법

 1. A 서비스, B 서비스, C 서비스 연동 코드가 HTTP 커넥션 풀을 공유한다.

 2. A 서비스의 장애로 응답 시간 지연이 발생하는 경우

  2-1. 풀에 남은 커넥션이 점점 줄어든다.

  2-2. 풀에서 커넥션을 구하는 대기 시간이 증가한다.

  2-3. B, C 서비스에 대한 연동도 함께 대기한다.

 

이 경우는 벌크헤드 패턴을 적용해 볼 수 있음. 벌크헤드 패턴은 기능의 종류마다 자원 사용을 분리하는 것을 의미함. 자원을 격리하여 서비스 일부에 장애가 발생해도 전체로 전파되지 않도록 보장해 주는 패턴이다.

위 예시에서는 외부 서비스마다 다르 HTTP 커넥션 풀을 사용하도록 벌크헤드 패턴을 적용할 수 있다. 서로 다른 커넥션 풀을 사용하기 때문에 A 서비스에 문제가 발생해도 B, C의 영향을 최소화 할 수 있다.

 

* 외부 서비스 장애가 계속 발생하면 어떻게 할까?

 지속되는 외부 서비스 장애로 타임아웃에 의한 서비스 에러가 발생할 수 있다. 외부 서비스가 장애가 발생했는데도 불구하고 운영 서버는 계속 요청을 보내게 되니, 불필요하게 응답 시간이 저해되고, 처리량도 감소하게 된다.

 이 문제를 해결하기 위해서는 서킷 브레이커를 적용할 수 있음. 서킷 브레이커는 오류가 지속되는 경우 일정 시간 동안 기능 실행을 차단할 수 있다. 서킷 브레이커가 빠른 실패를 도와주기 때문에 외부 서비스 장애에 의한 응답 시간 증가를 예방할 수 있다.