카테고리 없음

[주니어 백엔드 개발자가 반드시 알아야 할 실무 지식] 4. 외부 연동이 문제일 때 살펴봐야 할 것들

noahkim_ 2025. 8. 24. 18:40

최범균 님의 "주니어 백엔드 개발자가 반드시 알아야 할 실무 지식" 책을 정리한 포스팅 입니다.

 

  • 대규모 트래픽 요청 중 외부 시스템에 의존할 경우, 외부 시스템에서 부하를 감당하지 못해 장애가 발생할 수 있음
  • ✅ 연동 시스템의 품질도 함께 신경써야 함
  • ➡️ 문제를 완전히 차단하기는 어려우므로, 영향을 줄이도록 접근하기

 

1. 타임아웃

  • 외부 시스템 호출 시, 일정 시간 안에 응답이 없으면 강제로 중단하고 에러로 처리하는 기능
  • 타임아웃 시간을 설정하여 지정한 시간이 지나도 응답이 없을 경우 에러를 반환하기
  • ✅ 연동 서비스의 응답이 느릴 때, 연동 서비스에 대한 타임아웃을 설정하지 않으면 처리량이 급격히 떨어짐
  • ➡️ 사용자 경험 개선 (반응 없는 무한 대기보다는 에러 화면이 나음)
  • ➡️ 시스템 자원 보호 (자원이 포화되기 전에 응답)
  • ➡️ 격리 효과 (연동 서비스 문제가 다른 기능에 주는 영향을 줄일 수 있음)

 

종류

항목 Connection Timeout Read Timeout
정의 클라이언트가 서버와 TCP 연결을 맺는 데 걸리는 최대 시간 요청을 보낸 뒤 서버로부터 응답을 받는 데 걸리는 최대 시간
일반 설정 값 보통 3~5초 보통 5~30초
특징 연결 자체가 지연될 때 발생
(서버 다운, 네트워크 단절, 방화벽 등)
서버 처리 지연, 응답 전송 지연 시 발생
주의사항 너무 길게 잡으면 응답 없는 서버에 불필요하게 대기
✅ 민감한 기능은 길게 설정 필요
‼️ 서버가 정상 처리했어도 응답이 늦으면 타임아웃 에러 발생

 

2. 재시도

  • 재시도를 통해 연동 실패를 성공으로 바꿀 수 있음
  • ✅ 네트워크 통신 과정에서 간헐적으로 연결에 실패하거나 일시적으로 응답이 느려지는 경우가 있음

 

재시도 가능 조건

  • 데이터 일관성이 깨지지 않아야 함
  • ✅ 단순 조회 기능
  •  연결 타임아웃
  •  멱등성을 가진 변경 기능

 

재시도 설정

  • ✅ 횟수: "1~2번"이 적절
  • ✅ 간격: "3초"가 적절

 

재시도 폭풍 안티패턴

  • 재시도를 도입한다는 것은 연동 서비스에게 두배의 요청을 받도록 하는 것
  • ✅ 재시도 검토 시 연동 서비스의 성능 상황도 함께 고려해야 함

 

3. 동시 요청 제한

벌크헤드 패턴

  • 각 구성 요소를 격리하여 다른 구성 요소에 영향을 주지 않도록 하는 설계 패턴 
  •  연동 서비스의 최대 처리량을 고려하여 트래픽 받기
  •  연동 서비스의 최대 처리량에 초과되는 요청들은 거부함 (503 응답)

 

4. 서킷 브레이커

  • 과도한 오류가 발생하면 연동을 중지시키고 바로 에러 응답 (빠른 실패)
  • ✅ 연동 서비스가 장애일 때, 받은 요청은 연동 대신 바로 에러 응답

 

상태

상태 특징 동작 방식 전환 조건
Closed 정상 상태 모든 요청을 연동 서비스에 전달
- 오류 발생률이 지정한 임계치 이하이면 유지
- 임계치 초과 시 → Open 으로 전환
Open 차단 상태 요청을 연동하지 않고 즉시 에러 반환
- 일정 시간 동안 유지 (cool-down)
- 이후 자동으로 Half-Open 으로 전환
Half-Open 시험 상태 일부 요청만 연동 서비스에 전달
- 성공률이 임계치 이상 → Closed 복귀
- 실패 시 다시 Open 으로 전환
  •  닫힘 상태로 시작함

 

5. 외부 연동과 DB 연동

외부 연동과 트랜잭션 처리

  • DB 연동과 외부 연동을 함께 실행할 때는, 오류 발생 시 DB 트랜잭션을 어떻게 처리할 지 알맞게 판단해야 함
상황 문제점 대응 방법
외부 연동 실패 클라이언트 입장에서는 실패로 보이지만, 실제로는 외부 연동이 성공했을 수도 있음
(예: 읽기 타임아웃)
- 일정 주기로 두 시스템의 데이터 일치 여부 확인 & 보정
- 외부 시스템의 성공 확인 API 호출 후 롤백 여부 결정
외부 연동 성공,
DB 연동 실패
외부 시스템에는 반영됐지만, DB 트랜잭션은 롤백됨
- 외부 시스템에 취소(Compensation) API 호출
- 외부 연동을 이전 상태로 되돌려서 동기화

 

외부 연동이 느려질 때 DB 커넥션 풀 문제

  • 한 DB 트랜잭션 내 외부 연동이 포함될 경우, 외부 연동 지연만큼 커넥션 점유 시간이 늘어남
  • ✅ 외부 연동 지연이 늘어나면, 커넥션 풀이 가득차 요청애 대기 상태가 됨
  • ➡️ 트랜잭션 밖에서 외부 연동 시도하기 (단, 실패 시 롤백 불가)
  • ‼️ 실패한 외부 연동에 대한 후처리 필요 (보상 트랜잭션, 데이터 후보정 등)

 

6. HTTP 커넥션 풀

  • HTTP 요청 시, 연결 비용이 꽤 듬
  • HTTP 연결도 커넥션 풀을 사용하면 연결 시간을 줄일 수 있어 응답 속도 향상에 도움이 됨

 

고려사항

항목 설명 주의사항
커넥션 풀 크기 풀에 동시에 유지할 수 있는 최대 연결 수
- 연동 서비스의 처리 능력을 고려하여 설정
- 갑작스런 요청 폭주에도 대응 가능해야 함
커넥션 획득 대기 시간 요청이 들어왔을 때 풀에서 커넥션을 가져오기까지 기다리는 최대 시간 - 대기 시간이 너무 길면 전체 응답 지연
- 적절히 타임아웃 설정 필요
커넥션 유지 시간 서버와의 연결을 유지하는 시간 (keep-alive 헤더) - 서버가 지정한 값보다 오래 유지하면 안 됨

 

7. 연동 서비스 이중화

  • 기능이 연동 서비스가 필수일 경우, 장애 대응을 위해 필요함
  • 단, 비용은 배로 들 수 있음 
  • ✅ 해당 기능이 서비스의 핵심인지 
  •  이중화 비용이 감당 가능한 수준인지