[C#] HTTP Client Timeout

Arthur·2024년 7월 29일
0

HTTP Client Timeout을 설정하는 이유


HTTP프로토콜 사용 시 Request 후 Response를 받는 시간을 고려하지 않으면 문제가 발생할 수 있습니다.

Request를 보내는 함수가 Blocking 방식으로 작동한다면 N초 만큼 태스크가 정지될 수 있습니다.

우리가 호출하는 Rest API도 서버가 돌아가고 있는 것이고,
해당 Rest API 서버도 충분히 다운이 되거나 장애가 발생할 수 있습니다.

이런 상황까지 고려해서 HTTP Client Timeout에 대한 세팅을 하고 예외 처리를 해줘야 합니다.


정리하면

  • Request를 해당 API 서버에 보낸 후 Response를 받는 시간에 대한 고려하지 않는 문제.
  • Request를 해당 API 서버에 보낸 후 Response를 보내기까지의 시간을 알 수 없다.
  • 해당 API 서버의 처리 속도 혹은 장애로 인해 Response를 받는 시간이 지연될 수 있다.

위 예시와 같은 상황에 default Timeout 시간 값만큼 Blocking 될 수 있씁니다.



C# 코드로 알아보는 HTTP Client Timeout


string url = "https://velog.io/";

string request = "request message";
var content = new StringContent(request, System.Text.Encoding.UTF8, "text/plain");

// Timeout를 설정해주는 코드
httpClient.Timeout = TimeSpan.FromSeconds(3);

var response = await httpClient.PostAsync(address, content);

Timeout을 설정하는 코드는 상당히 심플합니다.

httpClient.Timeout = TimeSpan.FromSeconds(3);

위 한 줄만 추가하면 됩니다.


HttpClient가 정의된 곳을 보면 위와 같이 TimeSpan으로 Get/Set을 하는 것을 알 수 있습니다.
주석에도 적혀 있듯이 클라이언트가 서버로부터 응답을 기다리는 최대 시간을 설정합니다.
(여기서 클라이언트는 API 서버로 Request를 보내는 측을 말합니다.)


내부 코드를 좀 더 뜯어보면 C#에서는 디폴트 TimeOut은 100초(약 1분 40초)입니다.
TimeOut을 설정하지 않으면 진행 중인 테스크에 100초 정도의 Blocking이 발생하게 됩니다.



참고 자료


  • Golang: http.Client의 Timeout => 링크
  • [Java/자바] HttpClient에 Timeout 설정하기 => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글