연동 서비스를 호출할 때 타임아웃을 적절히 설정하지 않으면, 연동 서비스에 장애가 발생했을 때 전체 서비스의 품질이 급격히 나빠질 수 있다.

외부 의존성! 외부 서비스가 느려지면 우리 API 서버도 같이 느려진다. 병목현상.

타임아웃을 설정안해놓으면 연동 서비스의 응답이 느릴 때 처리량이 급격히 떨어진다.

사용자가 새로고침을 하게되면 같은 방법으로 새로운 요청을 또 보낸다. 이는 문제를 더 악화시킨다.

이런 문제를 완화하기 위한 방법 중 하나가 타임아웃인것.

사용자 요청에 대해 스레드 풀 같은 자원이 포화되기 전에 응답하게 되므로 연동 서비스 문제가 다른 기능에 주는 영향 줄일 수 있다.

2가지 타임아웃: 연결 타임아웃, 읽기 타임아웃

API 연동을 단순화해보면 연결, 요청, 응답, 종료의 4단계를 거친다.

연결이 꽤 오래걸리는데 너무 오래 걸릴때 그냥 실패를 떨어뜨리기 위한 연결 타임아웃을 세팅할 수 있다.

일단 연결이 되면 요청을 전송하고 응답을 기다리게 된다. 이때 응답을 받기까지 시간이 오래걸리면 앞서 말한 대기 시간 문제가 발생한다. 따라서 읽기 타임아웃을 설정해서 응답 대기 시간을 제한해야한다.

소켓 타임아웃과 읽기 타임아웃

읽기 타임아웃을 지정할 때는 실제 설정하는 값이 뭔지 확인해야한다. 예를 들어 Apache HttpClient 는 소켓 타임아웃을 설정한다. 소켓 타임아웃은 네트워크 패킷 단위를 기준으로 하므로, 전체 응답 시간에 대한 타임아웃을 의미하지는 않는다. 따라서 소켓 타임아웃을 5초로 지정해도 전체 응답 시간은 5초 이상 걸릴수도 있는것이다.

OkHttp는 일기 타임아웃과 별개로 호출 타임아웃을 지정할수있다. 호출 타임아웃은 요청 시작부터 응답까지의 전체 시간 기준으로 설정된다. 소켓 타임아웃을 5초, 호출 타임아웃을 10초로 설정하면 패킷은 계속 수진되지만 전체 처리 시간이 오래걸리는 경우에 타임아웃을 발생시킬수 있다.