En velger kan rotere perfekt og likevel fortsette å velge den første proxyen. Feilen er å ved et uhell opprette en ny velger for hver forespørsel, noe som nullstiller telleren før den har et andre valg å ta.

Konstruer velgeren én gang og behold den sammen med transporten. HTTP-proxylisten kan levere offentlige HTTP-kandidater for URL-settet når forespørslene tillater offentlige mellommenn. Start med en allerede validert, ikke-tom liste over proxy-URL-er:

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
    }
}

Den omkringliggende applikasjonen må avvise en tom liste, validere URL-ene og bruke de vanlige importene net/http, net/url og sync. Listen bør forbli uforanderlig mens denne velgeren bruker den, eller erstattes gjennom et separat synkronisert design.

Knytt den returnerte funksjonen til én beholdt http.Transport. Mutexen beskytter valgsekvensen på tvers av samtidige tilbakeringinger. Den krever ikke at en lås holdes mens en treg nettverksforespørsel fullføres.

Ikke bruk opp en rute bare for å skrive den ut

Å kalle velgeren igjen for en diagnostisk melding flytter telleren videre igjen. Den utskriften kan beskrive neste kandidat i stedet for kandidaten som forespørselen du undersøker brukte. Registrer valget inne i den ekte tilbakeringingen med en trygg endepunktidentifikator.

Et tilbakeringingskall er ikke bevis på at en forespørsel ble levert. Omdirigeringer eller ekstra transportforsøk kan komplisere en enkel antakelse om «ett applikasjonskall, ett valg». Hvis en arbeidsflyt må beholde én rute gjennom flere operasjoner, velg den ruten ved arbeidsflytens grense i stedet for å bruke en globalt roterende tilbakeringing.

Round-robin lover heller ikke forskjellige offentlige utganger. Det planlegger endepunkter. Den endelige identiteten forblir en egenskap ved veien hvert endepunkt leverer.

Relaterte artikler