본문 바로가기

Server

[개발] 외부 연동이 문제일 때 살펴봐야 할 것들

 

서비스를 운영하다 보면 "우리는 문제가 없는데 외부 연동 때문에 시스템이 터졌다"고 말하게 되는 순간이 꼭 온다.

사실 외부 연동에 하나인..

(사실 나는 외부 API 서비스를 제공하는 입장에서 우리 장애로 인하여 위와 같은 클레임을 진짜 많이 받았다.ㅎ)

외부 API, 인증 서버, 결제 연동 등 수많은 외부 시스템과 통신해야 하는 현대 백엔드 시스템에서, 외부 연동은 필연적인 리스크다.

이 글에서는 외부 연동 시 발생할 수 있는 문제들과 그에 대한 실무적인 점검 포인트를 정리해본다.


1. 타임아웃은 두 가지다

연결 타임아웃 (Connection Timeout)

서버에 연결을 시도할 때까지 대기하는 시간이다. 보통 수 ms ~ 수 초 이내로 설정하며, 너무 길면 아예 연결이 되지 않는 서버에 발이 묶이는 문제가 생긴다.

읽기 타임아웃 (Read Timeout)

연결은 되었지만, 응답이 오지 않을 때 대기하는 시간이다. 외부 서버가 지연될 경우 이 값이 중요하다.

💡 실무 팁:
대부분의 HTTP 클라이언트(OkHttp, RestTemplate 등)는 연결/읽기 타임아웃을 별도로 설정할 수 있다. 명시적으로 둘 다 설정하자.


2. 재시도는 언제나 조심스럽게

외부 연동 실패 시 재시도는 기본적인 복구 전략이다. 하지만 모든 실패가 재시도 가능한 것은 아니다.

✅ 재시도 가능한 경우

  • 네트워크 일시 장애
  • 5xx 오류 (서버 에러)
  • 타임아웃

❌ 재시도하면 안 되는 경우

  • 인증 실패 (401, 403)
  • 400 Bad Request
  • 비 idempotent한 요청(예: 결제, DB write)

⏱️ 재시도 전략

  • 횟수 제한: 2~3회 이내
  • 간격 조절: 고정 시간 간격 or 지수 백오프(Exponential Backoff)
  • 최대 대기 시간: 전체 재시도 시간 제한

🚨 재시도 폭풍 (Retry Storm) 안티패턴

모든 요청이 동시에 재시도를 하게 되면, 외부 시스템은 더 빠르게 무너진다. 이를 막기 위해:

  • 재시도 분산 (Jitter)
  • 동시 요청 제한을 함께 고려해야 한다.

3. 동시 요청 제한: 벌크헤드(Bulkhead) 패턴

외부 연동 하나가 터졌다고 전체 서비스가 멈추면 안 된다. 이를 방지하기 위한 전략이 벌크헤드다.

🧱 벌크헤드란?

외부 연동마다 전용 쓰레드 풀 or 큐 제한을 두어 다른 기능으로의 영향 전파를 막는다. (ex: A API는 최대 20건 동시 요청 허용)


4. 서킷 브레이커 (Circuit Breaker)

계속 실패하는 외부 시스템에 계속 연결을 시도하는 건 시간 낭비다. 이런 경우엔 회로 차단기를 내려야 한다.

🔌 기본 개념

  • 일정 실패율 이상이면 회로가 "열림(open)"
  • 일정 시간 후 "반쯤 열림(half-open)"으로 시도
  • 성공 시 회로 복구

대표 라이브러리: Resilience4j, Hystrix (deprecated)


5. DB 연동과 외부 연동의 경계

외부 연동이 느려질 경우, 진짜 위험해지는 건 내부 리소스다.

⚠️ 예: 외부 API 요청이 느려지면...

  • 쓰레드가 블로킹됨
  • DB 커넥션을 점유한 채 외부 응답 대기
  • 결국 DB 커넥션 풀 고갈 → 전체 장애

✅ 실무 전략

  • 외부 연동은 DB 트랜잭션 바깥에서 처리하자
  • 외부 API 응답 전에는 DB 연결을 반납할 수 있게 하자

6. HTTP 커넥션 풀 설정

성능과 안정성 모두를 위해 반드시 확인해야 하는 설정이다.

설정 포인트

  • 최대 커넥션 수 (maxTotal)
  • 호스트당 최대 커넥션 수 (maxPerRoute)
  • 커넥션 유휴 시간 관리 (idle timeout)

너무 적으면 병목, 너무 많으면 리소스 낭비.


7. 외부 연동 이중화

단일 외부 연동에 의존하면, 그 서비스가 죽을 때 함께 죽는다.

이중화 전략

  • 복수의 endpoint (ex: DNS Round Robin)
  • 글로벌 API라면 지역별 endpoint fallback
  • 필요시 API proxy or Failover Gateway 구축