-
RestTemplate Timeout - ResetTemplate Hands On 7Spring Framework/RestTemplate 2023. 9. 28. 00:01
개요
만약 호출하는 서버에 네트워크에 문제가 생겨서 응답시간이 지연되거나, 장애로 응답시간이 지연되는 경우 어떻게 처리해야 할까요?
무한정 대기를 하게 되면 쓰레드를 점유하게 되어 서버의 자원도 낭비되고, 유저가 응답을 받기까지 무한정 대기할 수도 없습니다.
@RestController class RestTemplateTimeoutTestController( private val restTemplate: RestTemplate, ) { @GetMapping("time-out") fun timeOut(){ val url = "http://localhost:8080/time-out-test" val newCreateRestTemplate = RestTemplate() newCreateRestTemplate.getForEntity(url, String::class.java) val responseEntity = restTemplate.getForEntity(url, String::class.java) println(responseEntity) } @GetMapping("time-out-test") fun timeOutTest(){ //100초 sleep sleep(100000) } } @Configuration class RestTemplateConfig{ @Bean fun restTemplate(restTemplateBuilder: RestTemplateBuilder): RestTemplate{ return restTemplateBuilder .setConnectTimeout(Duration.ofSeconds(5)) .setReadTimeout(Duration.ofSeconds(5)) .build() } }
restTemplate을 생성자로 단순하게 만들어내면 timeout 설정이 따로 들어가지 않습니다.
따라서 newCreateRestTemplate으로 호출시에는 100초를 대기했다가 응답을 가지고 옵니다.
여기에 RestTemplateBuilder를 사용하여 ConnectTimeout 그리고 ReadTimeout을 설정해 주면 5초 동안 지연이 발생하면 바로 readTimeout이 발생하게 됩니다.
Connect Timeout과 Read TimeOut의 차이점
Connection Timeout은 종단 간 연결하는데 소요되는 최대 시간을 의미합니다.
우리가 흔히 아는 TCP 3 way handshake를 통해 TCP 연결이 생성되는 것을 의미합니다.
Read Timeout은 이미 연결이 수립되었고, 데이터를 주고받을 때 소요되는 시간을 의미합니다.
이 시간을 넘기게 되면 데이터를 받을 수 없는 것으로 판단하고 에러가 발생합니다.
적절한 타임아웃 설정
서비스의 상황마다 달라질 수 있습니다.
Connection Timout의 경우에 TCP 연결과정에서는 SYN 패킷이 유실되었을 때 이를 다시 보내기 위한 시간(InitRTO)이 리눅스 상에 1초로 하드코딩되어 있어 SYN 패킷이 유실되면 최소 연결을 맺는데 1초 이상의 시간이 소요됩니다.
이때 최초의 유실에는 1초를 기다리고, 두 번째 유실은 2초를 기다리게 됩니다.
2번 이상의 패킷 유실이 발생했다면 3초 이상의 지연 시간이 발생하며 Connection Timeout이 3초라면 최소한 패킷 유실이 두 번 이상 발생할 수 있는 이야기가 됩니다.
이때 두 번 이상의 패킷 유실이 발생했다면 네트워크에 이슈가 있지 않은지 살펴보아야 하기 때문에 3초로 설정해 볼 수 있습니다.
Read Timeout의 경우에는 패킷 재전송을 위한 타임아웃 값이 최소 200ms이기 때문에 한 번의 패킷 유실을 고려해서 200ms 보다는 크게 잡습니다.
하지만 받는 쪽에서 요청을 처리하는 시간도 있기 때문에 고려해주어야 합니다. (제일 중요합니다)
만약 패킷의 유실을 한 번만 고려하여 1초로 잡았지만 요청을 처리하는 시간이 1초가 넘게 걸린다면 모든 요청이 timeout에 걸리게 됩니다.
참고자료
https://alden-kang.tistory.com/20
'Spring Framework > RestTemplate' 카테고리의 다른 글
RestTemplate Retry와 Interceptor 동작원리 - RestTemplate Hands On 8 (0) 2023.09.30 RestTemplate Retry 실습 - RestTemplate Hands On 7 (0) 2023.09.29 RestTemplate Error Handling - RestTemplate Hands On 6 (0) 2023.09.27 RestTemplate Post Request - RestTemplate Hands On 4 (0) 2023.09.24 RestTemplate Get Request - RestTemplate Hands On 3 (0) 2023.09.23