Jaettu kierrätysproksivalitsin Go:ssa
Pidä Go-proksivalitsin elossa pyyntöjen välillä, suojaa jaettu valintatila ja erota reitin valinta sen lähdön tarkkailusta.
Valitsin voi kierrättää täydellisesti ja valita silti aina ensimmäisen proksin. Virhe on luoda vahingossa uusi valitsin jokaista pyyntöä varten, mikä nollaa sen laskurin ennen kuin sillä on toista valintaa.
Rakenna valitsin kerran ja pidä se transportin kanssa. HTTP-proksiluettelo voi tarjota julkisia HTTP-ehdokkaita URL-joukolle, kun pyynnöt sallivat julkiset välittäjät. Aloita jo validoitusta, ei-tyhjästä proksi-URL-luettelosta:
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
}
}
Ympäröivän sovelluksen täytyy hylätä tyhjä luettelo, validoida URL-osoitteet ja käyttää tavallisia tuonteja net/http, net/url ja sync. Luettelon tulisi pysyä muuttumattomana, kun tämä valitsin käyttää sitä, tai se tulisi korvata erikseen synkronoidulla rakenteella.
Kiinnitä palautettu funktio yhteen säilytettävään http.Transport-olioon. Mutex suojaa valintajärjestyksen samanaikaisten takaisinkutsujen välillä. Se ei vaadi lukon pitämistä, kun hidas verkkopyyntö valmistuu.
Älä kuluta reittiä vain tulostaaksesi sen
Valitsimen kutsuminen uudelleen diagnostiikkaviestiä varten siirtää laskuria taas eteenpäin. Tämä tuloste voi kuvata seuraavaa ehdokasta sen sijaan, että se kuvaisi ehdokasta, jota tutkittava pyyntö käytti. Tallenna valinta varsinaisen takaisinkutsun sisällä turvallisella päätepistetunnisteella.
Takaisinkutsun kutsuminen ei todista, että pyyntö toimitettiin onnistuneesti. Uudelleenohjaukset tai lisätransportyritykset voivat monimutkaistaa yksinkertaista oletusta ”yksi sovelluskutsu, yksi valinta”. Jos työnkulun on pidettävä yksi reitti useiden toimintojen ajan, valitse kyseinen reitti työnkulun rajalla sen sijaan, että käyttäisit globaalia kierrättävää takaisinkutsua.
Kierrätys ei myöskään lupaa erillisiä julkisia lähtöjä. Se aikatauluttaa päätepisteet. Lopullinen identiteetti pysyy kunkin päätepisteen tarjoaman polun ominaisuutena.