서비스를 개발하며 외부 API를 호출하는 경우가 많이 존재한다.
외부 API를 호출할 때 발생하는 timeout 내역들을 정리해 놓고, 다음에 이슈가 발생했을 때 쉽게 기억을 떠올리기 위해서 정리해 두자.
Connection Timeout
클라이언트가 서버와 통신을 요청하기 전에 서로 Connection을 맺는 과정을 TCP 통신에서 3 way handshake이라 한다.
이 과정에서 일정 시간이 지나 connection을 맺지 못하는 경우에 발생할 수 있는 Timeout이다.
Caused by: java.net.SocketTimeoutException: Connect timed out
Socket Timeout ~= Read Timeout
클라이언트와 서버가 Connection을 맺은 이후에 발생할 수 있다.
데이터를 전송하는 Network IO 과정이 길어지면 클라이언트는 더 이상 통신이 불가능하다고 판단하고 Connection을 끊게 된다. 이때 발생하는 Timeout이다
Caused by: java.net.SocketTimeoutException: Read timed out
Connection Reset By Peer
위의 connection을 맺는 과정에서 connection이 모두 맺어지고
client 쪽에서 요청을 보냈는데 server 쪽에서 reset 패킷이 전달된 경우 발생할 수 있다고 한다.
이러한 경우 보통은 server 쪽에서는 keep-alive, idle-timeout이 모두 완료되어 connection을 닫았는데
client 쪽에서는 server보다 해당 값들이 더 길어서 발생할 수 있다.
위의 값들을 server보다 client의 값을 더 작게 해 보는 시도도 좋을 것 같다.