>백엔드 개발 >Golang >golang http 시간 초과 설정

golang http 시간 초과 설정

PHPz
PHPz원래의
2023-05-15 11:16:071976검색

Go 언어는 동시 프로그래밍을 지원하는 효율적인 프로그래밍 언어이므로 네트워크 프로그래밍에 탁월합니다. HTTP 프로토콜은 인터넷 애플리케이션을 구축하는 데 중요한 부분입니다. Go 언어의 http 패키지는 HTTP 요청 및 응답을 지원하는 수많은 인터페이스도 제공합니다. HTTP 네트워크 호출을 할 때 프로그램의 안정성과 성능을 보장하려면 시간 초과 구성이 매우 중요합니다.

시간 초과 설정은 매우 중요한 주제로, 네트워크 요청을 하거나 응답을 기다릴 때 프로그램이 기다려야 하는 시간을 정의하는 데 사용됩니다. HTTP 요청에서 서버가 시간 내에 응답하지 않으면 클라이언트는 요청을 종료하고 다른 논리를 수행해야 합니다. 마찬가지로, 긴 연결의 응답에서 클라이언트가 응답을 기다리고 있고 시간 초과 내에 연결을 유지할 수 없으면 전체 프로그램이 중단될 수 있습니다.

따라서 최근 Go 언어에서는 타임아웃 설정을 위한 제어 방식과 기술 솔루션에 대한 연구가 매우 활발합니다. 이 기사에서는 Go 언어를 사용하는 HTTP 네트워크 호출의 시간 초과 설정을 자세히 소개합니다.

  1. Go의 시간 초과 제한

Go 언어에서는 시간 초과 제한을 time 패키지를 통해 구현할 수 있습니다. time 패키지는 시간 초과 처리 및 타이밍을 구현하는 데 사용할 수 있는 Timer 유형을 제공합니다. 타이머를 사용하여 지정된 시간 후에 종료되는 기간을 만듭니다. 이 타이머가 만료되었는지 폴링할 수 있습니다. 타이머가 만료된 경우 요청 취소 또는 대체 서버 선택과 같은 일부 작업을 수행하십시오. 구체적인 구현은 다음과 같습니다.

timer := time.NewTimer(timeout)
defer timer.Stop()
select {
    case <-ch:
        return
    case <-timer.C:
        cancel()
        return
}

위 코드는 선택 및 타이머의 C 채널을 사용하여 대기합니다. 채널 ch가 수신기에 데이터를 전송하면 select가 해당 작업을 수행합니다. 타이머가 만료되면 취소 함수를 호출하여 진행 중인 작업을 취소합니다.

  1. 시간 초과 제어를 위해 컨텍스트 패키지 사용

Go 언어에서 컨텍스트 패키지는 좋은 시간 초과 설정 도구입니다. 컨텍스트 패키지는 여러 고루틴 호출에 걸쳐 값, 취소 신호 및 기한을 제어하는 ​​방법을 제공합니다. context.WithTimeout 메서드는 컨텍스트에 대한 시간 초과를 설정하고 새 컨텍스트를 반환하여 시간 초과를 제어합니다. 지정된 시간 내에 작업이 완료되면 타임아웃 타이머가 꺼집니다. 지정된 시간 내에 작업이 완료되지 않으면 타임아웃 타이머를 끄고 진행 중인 작업을 취소하세요. 이로 인해 context.WaitGroup은 여러 고루틴 실행을 처리하는 데 이상적입니다. 구체적인 구현은 다음과 같습니다.

ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()

req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
    log.Fatal(err)
}

res, err := http.DefaultClient.Do(req)
if err != nil {
    log.Fatal(err)
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)
if err != nil {
    log.Fatal(err)
}

위 코드에서는 context.WithTimeout 메서드를 통해 시간 초과 제어 컨텍스트가 생성됩니다. 그런 다음 http 요청을 생성하고 http.NewRequestWithContext 메서드를 통해 컨텍스트를 요청 개체와 연결합니다. 마지막으로 http.DefaultClient.Do 메소드를 사용하여 네트워크 요청을 하고 요청이 완료된 후 응답 내용을 읽습니다. 시간 초과가 발생하면 컨텍스트가 취소되고 후속 요청이 차단됩니다.

  1. 응용 프로그램 시간 초과 설정 모범 사례

시간 초과 설정을 사용할 때 다음 사항에 주의해야 합니다.

3.1 합리적인 시간 초과 설정:

시간 초과는 모든 HTTP 요청 및 응답을 허용할 만큼 길어야 합니다. 처리되는 데 필요한 만큼의 시간이 걸리지만 프로그램이 중단되는 것을 방지하는 데 너무 오래 걸리지는 않습니다. 제한 시간을 너무 길게 설정하면 애플리케이션이 다른 작업에 응답하지 못할 수 있습니다. 제한 시간을 너무 짧게 설정하고 요청을 너무 빨리 포기하면 불필요한 오류가 발생합니다. 따라서 실제 상황에 따라 타임아웃을 설정해야 합니다.

3.2 시간 초과 설정을 위해 withContext 메서드 사용

네트워크 요청을 할 때 컨텍스트를 http.NewRequestWithContext 메서드로 설정해야 요청과 시간 초과 설정 간의 긴밀한 연결을 보장할 수 있습니다. http.Client.Transport에서 Timeout 설정만 하면 요청 오류가 발생할 수 있습니다.

3.3 적절한 요청 재시도 제어:

네트워크 요청을 할 때 요청 재시도 횟수를 적절하게 제어하는 ​​데 주의를 기울여야 합니다. 요청 시간이 초과되면 직접 종료하는 대신 사용자에게 결과를 푸시하기 위해 요청을 재시도할 수 있는 횟수를 미리 설정해야 합니다.

  1. 요약

이 글에서는 HTTP 네트워크 요청의 안정성과 성능을 보장하기 위해 Go 언어의 시간 초과 설정 사용을 주로 소개합니다. 시간 초과 제한을 설정하기 위해 시간 패키지나 컨텍스트 패키지를 사용할 수 있습니다. 이 설정은 네트워크 작업을 수행할 때 프로그램 중단 및 불필요한 오류를 효과적으로 방지할 수 있습니다. 동시에, 타임아웃 설정 시 실제 상황을 고려하여 적절한 재시도 횟수를 유지해야 합니다. 실제 사용 시 상황에 맞게 활용해야 프로그램의 안정성과 성능을 확보할 수 있습니다.

위 내용은 golang http 시간 초과 설정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.