최범균 님의 "주니어 백엔드 개발자가 반드시 알아야 할 실무 지식" 책을 정리한 포스팅 입니다.
- 대규모 트래픽 요청 중 외부 시스템에 의존할 경우, 외부 시스템에서 부하를 감당하지 못해 장애가 발생할 수 있음
- ✅ 연동 시스템의 품질도 함께 신경써야 함
- ➡️ 문제를 완전히 차단하기는 어려우므로, 영향을 줄이도록 접근하기
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. 연동 서비스 이중화
- 기능이 연동 서비스가 필수일 경우, 장애 대응을 위해 필요함
- 단, 비용은 배로 들 수 있음
- ✅ 해당 기능이 서비스의 핵심인지
- ✅ 이중화 비용이 감당 가능한 수준인지