선택기는 완벽하게 돌아가면서도 계속 첫 번째 프록시를 고를 수 있습니다. 실수는 요청마다 실수로 새 선택기를 만드는 것이며, 그러면 두 번째 선택을 하기도 전에 카운터가 초기화됩니다.

선택기를 한 번만 만들고 전송과 함께 유지하십시오. HTTP 프록시 목록은 요청이 공개 중개자를 허용할 때 URL 집합에 공개 HTTP 후보를 제공할 수 있습니다. 이미 검증된 비어 있지 않은 프록시 URL 목록으로 시작하십시오:

func rotatingProxy(urls []*url.URL) func(*http.Request) (*url.URL, error) {
    var mu sync.Mutex
    next := 0
    return func(*http.Request) (*url.URL, error) {
        mu.Lock()
        selected := urls[next]
        next = (next + 1) % len(urls)
        mu.Unlock()
        return selected, nil
    }
}

주변 애플리케이션은 빈 목록을 거부하고, URL을 검증하며, 일반적인 net/http, net/url, sync 임포트를 사용해야 합니다. 목록은 이 선택기가 사용하는 동안 불변이어야 하며, 그렇지 않으면 별도로 동기화된 설계로 교체되어야 합니다.

반환된 함수를 유지된 http.Transport 하나에 붙이십시오. 뮤텍스는 동시 콜백 사이에서 선택 순서를 보호합니다. 느린 네트워크 요청이 끝나는 동안 잠금을 붙잡고 있을 필요는 없습니다.

출력하려고 경로를 소비하지 마십시오

진단 메시지를 위해 선택기를 다시 호출하면 카운터가 또 앞으로 나아갑니다. 그 출력은 조사 중인 요청이 사용한 후보가 아니라 다음 후보를 설명할 수 있습니다. 실제 콜백 안에서 안전한 엔드포인트 식별자로 선택을 기록하십시오.

콜백 호출은 요청이 성공적으로 전달되었다는 증거가 아닙니다. 리디렉션이나 추가 전송 시도는 “애플리케이션 호출 한 번, 선택 한 번”이라는 단순한 가정을 복잡하게 만들 수 있습니다. 워크플로가 여러 작업에 걸쳐 하나의 경로를 유지해야 한다면 전역 회전 콜백을 쓰는 대신 워크플로 경계에서 그 경로를 선택하십시오.

라운드 로빈도 서로 다른 공개 출구를 약속하지 않습니다. 그것은 엔드포인트를 예약할 뿐입니다. 최종 정체성은 각 엔드포인트가 제공하는 경로의 속성으로 남습니다.

관련 글