매일 공부/Backend CS

[매일메일] 동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애인가 발생한 경우 조치

개발하는 동그리 2025. 3. 26. 10:38
728x90
반응형
외부 서비스 장애로 인해 응답이 오래 걸리는 경우, 외부 API 응답으로 대기하는 자원들이 운영 서버 내부에 쌓이면서 성능에 악영향을 줄 수 있는데, 이를 해결하기 위해 가장 기본적인 방법은 타임아웃을 설정하는 것!
커넥션 타임아웃 : 서버와 연결하는 데 걸리는 시간 제한
리드 타임아웃 : 서버로부터 데이터를 읽는 데 걸리는 시간 제한
HTTP 커넥션 풀 타임아웃 : 커넥션 풀에서 커넥션을 가져오는 데 걸리는 시간 제한

이렇게 3가지의 큰 타임아웃 종류가 있다. 

 

특정 서비스가 전체 서비스에 영향을 주는 경우

1. A 서비스, B 서비스, C 서비스 연동 코드가 HTTP 커넥션 풀을 공유한다.
2. A 서비스의 장애로 응답 시간 지연이 발생하는 경우
2-1. 풀에 남은 커넥션이 점점 줄어든다.
2-2. 풀에서 커넥션을 구하는 대기 시간이 증가한다.
2-3. B, C 서비스에 대한 연동도 함께 대기한다.

이 경우는 벌크헤드 패턴을 적용해 볼 수 있습니다. 벌크헤드 패턴은 기능의 종류마다 자원 사용을 분리하는 것을 의미하는데요. 자원을 격리하여 서비스 일부에 장애가 발생해도 전체로 전파되지 않도록 보장해 주는 패턴입니다. 위 예시에서는 외부 서비스마다 다른 HTTP 커넥션 풀을 사용하도록 벌크헤드 패턴을 적용할 수 있습니다. 서로 다른 커넥션 풀을 사용하기 때문에 A 서비스에 문제가 발생해도 B,C의 영향을 최소화할 수 있습니다.

 

외부 서비스 장애가 계속 발생하면 어떻게 되나요?

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

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


1. 커넥션 타임아웃 (Connection Timeout)

  • 정의: 커넥션 타임아웃은 서버와의 연결을 시도할 때, 즉 클라이언트와 서버 간의 TCP 연결을 설정하는 데 걸리는 시간을 제한하는 값입니다.
  • 목적: 외부 서버가 응답을 시작하기 전에 연결이 안 될 경우(예: 서버가 응답하지 않거나 너무 느릴 때), 연결 시도 자체를 일정 시간 내에 포기하도록 하는 것입니다.
클라이언트가 외부 서버에 연결하려고 시도하는데, 만약 서버가 응답하지 않거나 연결되지 않는다면, 커넥션 타임아웃이 발생합니다.

예를 들어, 커넥션 타임아웃을 5초로 설정하면, 5초 이내에 외부 서버와 연결이 성립되지 않으면, 오류가 발생하고 연결이 종료됩니다.

 

2. 리드 타임아웃 (Read Timeout)

  • 정의: 리드 타임아웃은 서버와 연결이 성립된 후, 서버로부터 응답 데이터를 읽는 데 걸리는 시간을 제한하는 값입니다.
  • 목적: 클라이언트가 서버와 연결되었지만, 서버가 응답을 보내는 데 시간이 너무 오래 걸릴 경우 일정 시간 내에 응답을 기다리지 않고 타임아웃을 발생시키는 것입니다.
클라이언트가 외부 서버에 요청을 보내고, 서버가 응답을 시작했지만, 응답 내용이 너무 오래 걸린다면, 리드 타임아웃이 발생합니다.

예를 들어, 리드 타임아웃을 10초로 설정하면, 서버가 응답을 시작한 이후 10초 이내에 모든 데이터를 받지 못하면 타임아웃이 발생합니다.

 

3. HTTP 커넥션 풀 타임아웃 (HTTP Connection Pool Timeout)

  • 정의: HTTP 커넥션 풀 타임아웃은 서버가 외부 서버와 연결을 맺기 위한 커넥션 풀을 관리할 때, 커넥션을 대기하는 시간이 일정 시간이 지나면 풀에서 커넥션을 사용할 수 없도록 설정하는 값입니다.
  • 목적: 여러 개의 요청을 처리하기 위해 커넥션 풀에서 커넥션을 사용하려 할 때, 커넥션 풀에서 사용 가능한 커넥션이 없다면, 기다리는 시간을 제한하는 것입니다.
서버가 외부 API 서버와 연결을 맺을 때, 커넥션 풀에서 커넥션을 가져와야 합니다. 만약 커넥션 풀이 다 차있고, 커넥션을 기다려야 한다면, 이 대기 시간을 제한하는 것이 커넥션 풀 타임아웃입니다.

예를 들어, 커넥션 풀 타임아웃을 3초로 설정하면, 커넥션 풀에서 사용할 수 있는 커넥션을 3초 내에 확보하지 못하면 타임아웃이 발생합니다.

 

 

 

 

서킷 브레이커 작동 방식

서킷 브레이커는 주로 3가지 상태로 작동합니다:

  1. Closed (닫힘 상태):
    • 정상적으로 외부 서비스와 통신하고 있을 때의 상태입니다.
    • 서버가 외부 API에 요청을 보내고 응답을 기다립니다.
    • 요청이 성공하면 계속해서 외부 서비스에 요청을 보냅니다.
  2. Open (열림 상태):
    • 오류가 일정 수준 이상 발생하면, 서킷 브레이커가 열림 상태로 전환됩니다.
    • Open 상태에서는 외부 서비스에 대한 요청을 차단합니다. 즉, 장애가 발생하는 서비스로의 요청을 더 이상 보내지 않고, 바로 실패 응답을 반환합니다.
    • 이 상태에서 일정 시간이 지나면 서킷 브레이커가 half-open 상태로 전환됩니다.
  3. Half-open (반개방 상태):
    • 일정 시간이 지나면 서킷 브레이커가 반개방 상태로 전환됩니다.
    • 이 상태에서는 일부 요청만 외부 서비스로 전송하여 서비스가 정상화되었는지 테스트합니다.
    • 서비스가 정상적으로 응답을 반환하면 서킷 브레이커는 다시 Closed 상태로 돌아가고, 요청을 계속 보냅니다.
    • 만약 여전히 장애가 발생하면 다시 Open 상태로 돌아갑니다.

 

서킷 브레이커 예시)

 

 

  • 서버가 외부 서비스로 API 요청을 보냅니다.
  • 외부 서비스가 장애로 응답을 하지 않거나 오류를 반환하면, 서킷 브레이커가 열림 상태로 전환됩니다.
  • 이 상태에서는 서버는 더 이상 외부 서비스로 요청을 보내지 않으며, 즉시 실패로 응답을 보냅니다. (이를 통해 서버 자원이 낭비되지 않습니다)
  • 일정 시간이 지난 후, 서킷 브레이커는 다시 반개방 상태로 돌아가서 일부 요청을 외부 서비스에 보내어 장애가 해결되었는지 확인합니다.
  • 장애가 해결되면, 서킷 브레이커는 닫힘 상태로 돌아가고 정상적으로 요청을 보낼 수 있습니다.
  • 장애가 계속되면, 서킷 브레이커는 다시 열림 상태로 돌아갑니다

 

 

https://www.maeil-mail.kr/question/74

 

매일메일 - 기술 면접 질문 구독 서비스

기술 면접 질문을 매일매일 메일로 보내드릴게요!

www.maeil-mail.kr

 

 

728x90
반응형