En vælger kan rotere perfekt og alligevel blive ved med at vælge den første proxy. Fejlen er ved et uheld at oprette en ny vælger for hver forespørgsel, hvilket nulstiller dens tæller, før den har et andet valg at træffe.

Konstruer vælgeren én gang, og behold den sammen med transporten. HTTP-proxylisten kan levere offentlige HTTP-kandidater til URL-sættet, når forespørgslerne tillader offentlige mellemled. Start med en allerede valideret, 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
    }
}

Det omgivende program skal afvise en tom liste, validere URL’erne og bruge de normale imports net/http, net/url og sync. Listen bør forblive uforanderlig, mens denne vælger bruger den, eller blive erstattet gennem et særskilt synkroniseret design.

Knyt den returnerede funktion til én bevaret http.Transport. Mutexen beskytter valgsekvensen på tværs af samtidige tilbagekald. Den kræver ikke, at der holdes en lås, mens en langsom netværksforespørgsel færdiggøres.

Forbrug ikke en rute bare for at udskrive den

At kalde vælgeren igen til en diagnostisk meddelelse flytter tælleren igen. Det output beskriver måske den næste kandidat i stedet for den kandidat, som den undersøgte forespørgsel brugte. Registrer valget inde i det rigtige tilbagekald med en sikker slutpunktsidentifikator.

Et tilbagekaldskald er ikke bevis på, at en forespørgsel blev leveret med succes. Omdirigeringer eller ekstra transportforsøg kan komplicere en simpel antagelse om „ét programkald, ét valg“. Hvis en arbejdsgang skal beholde én rute gennem flere operationer, vælg den rute ved arbejdsgangens grænse i stedet for at bruge et globalt roterende tilbagekald.

Round-robin lover heller ikke forskellige offentlige udgange. Den planlægger slutpunkter. Den endelige identitet forbliver en egenskab ved den vej, hvert slutpunkt leverer.

Relaterede artikler