Connection time out 과 Read time out, 그리고 해결 및 이슈..
- Conection time out
클라이언트가 서버측으로 connection 맺길 원하지만 서버와 connection이 맺어지지 못할 때 발생한다.
이 경우, 클라이언트의 OUTBOUND, 서버 측의 INBOUND 방화벽을 확인해 볼 필요가 있다.
- Read time out
Connection time out과는 다르게 클라이언트와 서버가 connection은 맺어졌지만, I/O 작업이 길어지거나 데이터를 읽어가지 못하는 상황이 되어, 설정된 시간을 초과하여 생기는 문제이다.
보통 Tcp connection 은 3way-HandShake 방식으로 수행한다. 해당 방식을 통해 정상적으로 수행하게 되면 Connection이 맺어지고, 서버 측에서 데이터를 전달, 클라이언트에서 읽어가는 형식이다.
- Socket time out
connection이 맺어진 후, 서버는 데이터를 전송하는데 하나의 패킷으로 데이터를 전소하지 않고 여러 개의 패킷으로 나눠서 전송하게 되는데, 각 패킷 간의 시간 Gap이 생길 수 있는데 이 시간의 임계치를 넘어간다면 Socket time out이 발생한다. 즉, 각 패킷간의 시간 Gap을 의미한다.
3way-handshake
Springboot RestTemplate 에서 Read time out 이나 connection time out 등이 발생할 경우, 설정에 의해 connection time out, socket time out, read time out 시간을 조절 할 수 있다.
@Configurationpublic class RestTemplateConfiguration {@Beanpublic RestTemplate restTemplate() {return new RestTemplate(getRequestFactoryAdvanced());}private ClientHttpRequestFactory getRequestFactoryAdvanced() {RequestConfig config = RequestConfig.custom().setSocketTimeout(3000).setConnectTimeout(3000).setConnectionRequestTimeout(3000).build();CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(client);clientHttpRequestFactory.setReadTimeout(5000);return clientHttpRequestFactory;}}
위와 같은 설정과 더불어 서버간 통신 상황을 확인하고자 할 땐 ping, wget, telnet, curl을 이용해보자.
비정상적인 연결 상황
이 외, 비정상적인 상황…
정상적인 연결 상황
이외에도, Inbound 를 열지 않았을 경우, connection time out 이 발생한다.
※ 위와 같은 상황은 서버의 네트워크 방화벽, 보안 솔루션 등의 이슈로 인해 connection time out, read time out이 발생할 수 있으니 해당 부분을 의심해볼 수 있다.