타임아웃 - 외부 연동에서 가장 중요한 설정

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

  • 외부 의존성! 외부 서비스가 느려지면 우리 API 서버도 같이 느려진다. 병목현상
  • 타임아웃을 설정안해놓으면 연동 서비스의 응답이 느릴 때 처리량이 급격히 떨어짐
  • 사용자가 새로고침을 하게되면 같은 방법으로 새로운 요청을 또 보낸다 => 이는 문제를 더 악화

  • 이런 문제를 완화하기 위한 방법 중 하나가 타임아웃인것.
  • 사용자 요청에 대해 스레드 풀 같은 자원이 포화되기 전에 응답하게 되므로...
  • 연동 서비스 문제가 다른 기능에 주는 영향 줄일 수 있다.

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

  • API 연동을 단순화해보면 연결, 요청, 응답, 종료의 4단계를 거친다.
  • 연결이 꽤 오래걸리는데 너무 오래 걸릴때 그냥 실패를 떨어뜨리기 위한 연결 타임아웃을 세팅할 수 있음
  • 일단 연결이 되면 요청을 전송하고 응답을 기다리게 됨
    • 이때 응답을 받기까지 시간이 오래걸리면 앞서 말한 대기 시간 문제가 발생
    • 따라서 읽기 타임아웃을 설정해서 응답 대기 시간을 제한해야됨

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

  • 읽기 타임아웃을 지정할 때는 실제 설정하는 값이 뭔지 확인해야함
  • 예를 들어 Apache HttpClient 는 소켓 타임아웃을 설정
  • 소켓 타임아웃은 네트워크 패킷 단위를 기준으로 하므로, 전체 응답 시간에 대한 타임아웃을 의미하지는 않는다
  • 따라서 소켓 타임아웃을 5초로 지정해도 전체 응답 시간은 5초 이상 걸릴수도 있는것이다.
  • OkHttp는 읽기 타임아웃과 별개로 호출 타임아웃을 지정할수있다
  • 호출 타임아웃은 요청 시작부터 응답까지의 전체 시간 기준으로 설정된다
  • 소켓 타임아웃을 5초, 호출 타임아웃을 10초로 설정하면 패킷은 계속 수신되지만 전체 처리 시간이 오래걸리는 경우에 타임아웃을 발생시킬수 있다