[Back end] 네트워크 타임아웃(Timeout)

2025. 9. 5. 12:25·Back end
반응형

1. 네트워크 타임아웃이란?

네트워크 타임아웃은 서버에 요청을 보냈지만 일정 시간 동안 응답을 받지 못하면 발생하는 에러입니다.
타임아웃이 없다면 요청은 무한정 대기 상태에 빠져 서버 자원을 고갈시키고, 장애로 이어질 수 있습니다.

즉, 타임아웃은 리소스를 보호하고 시스템 안정성을 유지하기 위한 안전장치입니다.


2. 타임아웃의 종류

✅ Connection Timeout

  • 정의: 클라이언트가 서버에 연결을 시도할 때, TCP 3-way handshake가 일정 시간 내에 완료되지 않으면 발생
  • 발생 지점: TCP 연결 수립 과정
  • 원인 예시: 방화벽 차단, 서버 다운, 잘못된 포트, 네트워크 단절
  • 실무 사례: 결제 API 연동 시, 클라이언트 방화벽에서 대상 서버의 IP/포트를 허용하지 않아 연결 실패할 경우 발생

💡 (cc. TCP 3-way Handshake란?)
TCP 통신에서 신뢰성 있는 연결을 맺기 위해 클라이언트와 서버가 거치는 3단계 과정

  1. SYN: 클라이언트가 서버에 연결 요청
  2. SYN-ACK: 서버가 연결 가능하다고 응답
  3. 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
'Back end' 카테고리의 다른 글
  • [Servlet/JSP] 상태 저장 공간 정리: Request, Session, Cookie, Application
  • [CS] MVC와 MVVM 모델
Kim-SooHyeon
Kim-SooHyeon
개발일기 및 알고리즘, 블로그 운영에 대한 글을 포스팅합니다. :) 목표: 뿌리 깊은 개발자 되기
    반응형
  • Kim-SooHyeon
    soo_vely의 개발로그
    Kim-SooHyeon
  • 전체
    오늘
    어제
    • 분류 전체보기 (253)
      • 알고리즘 (108)
        • 자료구조 (3)
        • Java (104)
        • Python (1)
      • Back end (70)
        • Spring Project (27)
        • Java (21)
        • API (1)
        • Python (0)
        • Django (3)
        • Linux (1)
        • 서버 (2)
        • 에러로그 (11)
        • 부스트 코스 (1)
      • Front end (9)
        • HTML, CSS (4)
        • JavaScript (4)
        • JQuery (0)
      • 기타 프로그래밍 (4)
        • Android Studio (1)
        • Arduino (2)
        • Azure Fundamental(AZ-900) (1)
      • 개발도구 (23)
        • Git (12)
        • SVN (0)
        • Eclipse (2)
        • 기타 Tool (9)
      • Database (16)
        • Oracle (10)
        • MySQL (0)
        • H2 Database (3)
        • ORM & JPA (1)
      • 자격증 (10)
        • 컴활 1급 (7)
        • 컴활 2급 (2)
        • SQLD (1)
      • 기타 (13)
        • 블로그 운영 (6)
        • 문서 (1)
        • 기타 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    solved.ac
    spring
    for문
    알고리즘
    단계별풀기
    구현
    java
    백준알고리즘
    배열
    Git
    Oracle
    1차원 배열
    BOJ
    jpa
    백준
    springboot
    백준 자바
    문자열
    오라클
    github
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kim-SooHyeon
[Back end] 네트워크 타임아웃(Timeout)
상단으로

티스토리툴바