Parinkiklis gali tobulai suktis ir vis tiek rinktis pirmąjį proxy. Klaida yra netyčia kurti naują parinkiklį kiekvienai užklausai, nes tai atstato jo skaitiklį dar prieš jam turint antrą pasirinkimą.

Sukurkite parinkiklį vieną kartą ir laikykite jį kartu su transportu. HTTP proxy sąrašas gali pateikti viešus HTTP kandidatus URL rinkiniui, kai užklausos leidžia viešus tarpininkus. Pradėkite nuo jau patvirtinto, netuščio proxy URL sąrašo:

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

Aplinkinė programa turi atmesti tuščią sąrašą, patvirtinti URL ir naudoti įprastus net/http, net/url ir sync importus. Sąrašas turėtų likti nekintamas, kol šis parinkiklis jį naudoja, arba būti pakeistas atskirai sinchronizuotu sprendimu.

Priskirkite grąžintą funkciją vienam laikomam http.Transport. Mutex apsaugo pasirinkimo seką tarp lygiagrečių atgalinių iškvietimų. Nereikalaujama laikyti užrakto, kol baigiama lėta tinklo užklausa.

Nenaudokite maršruto vien tam, kad jį atspausdintumėte

Dar kartą iškvietus parinkiklį diagnostikos pranešimui skaitiklis vėl pasislenka. Ta išvestis gali apibūdinti kitą kandidatą, o ne tą, kurį naudojo tiriama užklausa. Užfiksuokite pasirinkimą tikrojo atgalinio iškvietimo viduje naudodami saugų galinio taško identifikatorių.

Atgalinio iškvietimo iškvietimas nėra įrodymas, kad užklausa sėkmingai pristatyta. Nukreipimai ar papildomi transporto bandymai gali apsunkinti paprastą prielaidą „vienas programos iškvietimas, vienas pasirinkimas“. Jei darbo eigai reikia išlaikyti vieną maršrutą per kelias operacijas, pasirinkite tą maršrutą darbo eigos riboje, o ne naudokite pasaulinį besisukantį atgalinį iškvietimą.

Apvalusis keitimas taip pat nežada skirtingų viešų išėjimų. Jis planuoja galinius taškus. Galutinė tapatybė lieka kelio, kurį pateikia kiekvienas galinis taškas, savybe.

Susiję straipsniai