반응형
1. 네트워크 타임아웃이란?
네트워크 타임아웃은 서버에 요청을 보냈지만 일정 시간 동안 응답을 받지 못하면 발생하는 에러입니다.
타임아웃이 없다면 요청은 무한정 대기 상태에 빠져 서버 자원을 고갈시키고, 장애로 이어질 수 있습니다.
즉, 타임아웃은 리소스를 보호하고 시스템 안정성을 유지하기 위한 안전장치입니다.
2. 타임아웃의 종류
✅ Connection Timeout
- 정의: 클라이언트가 서버에 연결을 시도할 때, TCP 3-way handshake가 일정 시간 내에 완료되지 않으면 발생
- 발생 지점: TCP 연결 수립 과정
- 원인 예시: 방화벽 차단, 서버 다운, 잘못된 포트, 네트워크 단절
- 실무 사례: 결제 API 연동 시, 클라이언트 방화벽에서 대상 서버의 IP/포트를 허용하지 않아 연결 실패할 경우 발생
💡 (cc. TCP 3-way Handshake란?)
TCP 통신에서 신뢰성 있는 연결을 맺기 위해 클라이언트와 서버가 거치는 3단계 과정
- SYN: 클라이언트가 서버에 연결 요청
- SYN-ACK: 서버가 연결 가능하다고 응답
- ACK: 클라이언트가 서버의 응답을 확인하고 연결 확립
✅ Socket Timeout
- 정의: 이미 연결은 되었지만, 데이터 수신/송신이 일정 시간 내에 이뤄지지 않을 때 발생
- 발생 지점: TCP 연결 성립 후, 데이터 송수신 과정
- 원인 예시: 서버 과부하로 응답 지연, 네트워크 중간 장애로 패킷 유실
✅ Read Timeout
- 정의: 클라이언트가 서버와 연결된 뒤, 입출력(I/O) 작업에서 데이터를 읽는 동작이 일정 시간 내 완료되지 않으면 발생
- 원인 예시: 서버가 응답을 늦게 처리하거나, 응답 데이터가 너무 커서 전송 시간이 오래 걸리는 경우
- 실무 사례: 결제 승인 요청을 보냈으나 서버 처리 속도가 느려, 30초 이상 응답이 없을 때 Read Timeout 발생
3. 타임아웃은 실패일까?
타임아웃이 났다고 해서 요청이 반드시 실패했다고 확정할 수는 없습니다.
예를 들어, 클라이언트가 게시물 작성 요청을 보냈는데 DB 작업이 오래 걸려 Read Timeout이 발생했다고 해봅시다.
- 클라이언트 입장: 응답을 못 받았으니 실패 처리
- 서버 입장: 늦게 처리됐지만 DB에 게시물 정상 저장
👉 타임아웃 = "응답을 받지 못했다"이지, "요청이 실패했다"는 보장은 없습니다.
4. 타임아웃 대응 전략
1) 재시도 (Retry)
- 단순히 다시 요청을 보내 성공 여부를 확인
- 주의점: 모든 요청을 무작정 재시도하면
- 중복 처리(예: 주문 두 번 생성)
- Retry Storm(대규모 폭풍 재시도 → 서버 과부하)가 발생할 수 있음
2) 멱등성 (Idempotency)
- 같은 요청을 여러 번 보내도 결과가 변하지 않는 성질
- 방법: Idempotency Key를 요청에 포함 → 서버가 같은 키의 요청이면 결과를 재사용
- 실무에서 결제 API는 대부분 멱등키로 안전한 재시도를 지원
3) 재시도 전략
- Exponential Backoff (지수적 대기)
- 재시도 간격을 1초 → 2초 → 4초 → 8초… 식으로 점진적으로 늘려 서버 부하를 줄임
- Exponential Backoff with Jitter (무작위성 추가)
- 대기 시간에 랜덤성(Jitter)을 더해 같은 시각에 요청이 몰리는 것을 방지
- 대규모 트래픽 환경(예: 수만 건 결제 요청)에서 효과적
4) 중복 주문 방지
- 접근 방식: 주문 서버가 요청을 대기 상태(Pending)로 먼저 저장
- 결제 서버 응답에 따라 상태를 성공(Success) / 실패(Failure)로 전환
- 결제가 확정되지 않은 상태라면,
- 새로운 주문 생성은 막고
- "이전 주문 처리 중" 메시지를 노출하여 중복 주문 방지
5) 최종 확정
- Polling 방식
- 주문 서버가 일정 주기마다 결제 서버에 상태 조회
- 단점: 트래픽/부하 증가
- Message Queue/Event 방식 (권장 ✅)
- 결제 서버가 상태 변화 이벤트를 발행
- 주문 서버가 이를 구독하여 상태 업데이트
- 실시간성 + 효율성 확보
📌 정리
타임아웃은 네트워크 지연뿐 아니라 시스템 신뢰성·데이터 정합성과 직결되는 중요한 설계 요소입니다.
특히 금융, 주문·결제 같은 민감한 영역에서는 멱등성과 재시도 전략을 적용해야 사용자 경험과 데이터 정합성을 모두 보장할 수 있습니다.
반응형
'Back end' 카테고리의 다른 글
| [Servlet/JSP] 상태 저장 공간 정리: Request, Session, Cookie, Application (0) | 2025.04.09 |
|---|---|
| [CS] MVC와 MVVM 모델 (0) | 2025.01.10 |