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

(사실 나는 외부 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 구축
'Server' 카테고리의 다른 글
| [개발] 비동기 연동, 언제 어떻게 써야 할까? (0) | 2025.06.10 |
|---|---|
| [개발] 성능을 좌우하는 DB 설계와 쿼리 (1) | 2025.05.26 |
| [개발] 느려진 서비스, 어디서부터 봐야될까? #2. 서버 성능 개선 기초 (2) | 2025.05.20 |
| [개발] 느려진 서비스, 어디서부터 봐야될까? #1. 처리량과 응답시간 (2) | 2025.05.17 |
| [Linux] systemd 은 뭐하는 아이 일까? (1) | 2024.10.20 |