Connection Timeout과 Read Timeout의 의미
- Connection Timeout
서버와 클라이언트가 연결되는 데 걸리는 최대 시간. 주로 TCP 연결이 설정되는 3-way handshake에서 발생하는 타임아웃임. 연결이 설정되지 않으면 에러가 발생함. - Read Timeout
이미 연결된 상태에서 데이터가 주고받는 데 걸리는 최대 시간. 이 시간을 초과하면 데이터를 읽을 수 없는 것으로 보고 에러 발생. 간단히 말해 데이터를 읽는 중에 설정되는 타임아웃임.
적절한 타임아웃 값 설정 방법
네트워크는 항상 100% 안정적이지 않고, 패킷 유실도 종종 일어날 수 있음.
타임아웃을 설정할 때 두 가지를 고려해야 함:
- 네트워크에서 발생하는 패킷 유실이 꼭 장애 상황은 아님.
- 네트워크 문제가 발생하면 빠르게 인지할 필요가 있음.
너무 짧으면 간헐적인 패킷 유실로 불필요한 타임아웃 발생 가능. 너무 길면 네트워크 이슈 파악이 늦어짐. 적정 타임아웃 설정은 서비스 특성에 맞춰 잡는 게 중요함.
Connection Timeout 설정하기
TCP 연결 과정에서 발생하는 패킷 유실 상황을 고려해야 함. 특히 세 가지 케이스에서 패킷이 유실될 수 있음:
- SYN 패킷 유실
A가 B로 연결 요청(SYN 패킷)을 보내지만 중간에서 유실. 이 경우 A는 SYN 재전송을 통해 연결을 시도하고, 최초 타임아웃(InitRTO)은 보통 1초로 설정됨. - SYN+ACK 패킷 유실
B가 A로 응답(SYN+ACK)을 보내지만 유실된 경우, A는 SYN 재전송을 함. 결과적으로 SYN 패킷 유실 시와 비슷한 방식으로 동작함. - ACK 패킷 유실
A와 B가 서로의 RTT 값을 알게 된 상황에서 ACK 패킷이 유실. 이 경우 RTT 기반의 타임아웃(RTO)을 적용, 보통 최소 200ms 이상 기다림.
Connection Timeout은 한 번의 패킷 유실을 감안해 3초 정도가 적당함. 1초 정도는 기다리고, 두 번째 유실이 발생하면 네트워크 문제를 의심할 수 있는 기준이 됨.
Read Timeout 설정하기
Read Timeout은 보통 Connection Timeout보다 짧게 설정하는 게 좋음. RTO가 보통 1초 이내로 짧기 때문에, 한 번의 패킷 유실을 고려해 최소 200ms 이상으로 잡아야 함.
예를 들어, RTT가 10ms, 요청을 처리하는 데 300ms가 걸린다면 기본적으로 310ms가 필요. 패킷 유실이 한 번 발생하면 510ms 정도 걸림. 이런 점을 고려해 Read Timeout을 1초 정도로 잡는 게 적당함.
다만, 서비스에 따라 프로세싱 시간이 길다면 Read Timeout을 길게 설정해야 함.
결론
Connection Timeout과 Read Timeout을 설정할 때는 이 두 타임아웃의 의미를 정확히 이해하고, 서비스 특성에 맞는 기준을 세우는 게 중요함. 무작정 남들이 쓰는 값에 맞추는 대신, 네트워크 상황과 서비스 성격에 맞춰서 최적의 타임아웃 값을 찾아야 안정적인 서비스 운영이 가능.
참조
Connection Timeout과 Read Timeout 살펴보기
가게노출 파트의 조금은 색다른 파일럿 프로젝트, 그리고 첫 업무까지의 이야기 | 우아한형제들 기술블로그
'1.프로그래밍 > 개발' 카테고리의 다른 글
Linux에 MiniKube 설치하기 (0) | 2024.10.29 |
---|---|
Docker 란? (0) | 2024.10.24 |
헤이즐 캐스트 (Hazelcast) 란? (0) | 2024.10.24 |
[NHN Academy] NHN Academy 인증 과정 (9) | 2023.03.24 |
[NHN Academy] NHN Academy 인증 과정 프로젝트 발표 (0) | 2023.03.24 |