Valija võib täiuslikult ringelda ja valida ikkagi esimest proksit. Viga on selles, et iga päringu jaoks luuakse kogemata uus valija, mis lähtestab loenduri enne, kui sellel on teist valikut teha.

Ehitage valija üks kord ja hoidke seda koos transportiga. HTTP prokside loend võib anda URL-ide hulgale avalikke HTTP kandidaate, kui päringud lubavad avalikke vahendajaid. Alustage juba valideeritud, mittetühja proksi URL-ide loendiga:

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

Ümbritsev rakendus peab tühja loendi tagasi lükkama, URL-id valideerima ja kasutama tavalisi importe net/http, net/url ja sync. Loend peaks jääma muutumatuks, kuni see valija seda kasutab, või asendatama eraldi sünkroonitud lahendusega.

Kinnitage tagastatud funktsioon ühe säilitatava http.Transport külge. Mutex kaitseb valikujärjestust samaaegsete tagasikutsete vahel. See ei nõua luku hoidmist aeglase võrgupäringu lõpuleviimise ajal.

Ärge kulutage marsruuti ainult selle printimiseks

Valija uuesti kutsumine diagnostikasõnumi jaoks liigutab loendurit jälle edasi. See väljund võib kirjeldada järgmist kandidaati, mitte kandidaati, mida uuritav päring kasutas. Salvestage valik tegeliku tagasikutse sees turvalise lõpp-punkti identifikaatoriga.

Tagasikutse käivitamine ei ole tõestus, et päring edukalt kohale toimetati. Ümbersuunamised või täiendavad transpordikatsed võivad muuta lihtsa eelduse „üks rakenduse kutse, üks valik“ keerulisemaks. Kui töövoog peab mitme toimingu jooksul hoidma ühte marsruuti, valige see marsruut töövoo piiril, selle asemel et kasutada globaalset pöörlevat tagasikutset.

Ringrotatsioon ei taga ka erinevaid avalikke väljundeid. See ajastab lõpp-punkte. Lõplik identiteet jääb iga lõpp-punkti pakutava tee omaduseks.

Seotud artiklid