Zdieľaný kruhový selektor proxy v Go
Udržujte selektor proxy v Go živý medzi požiadavkami, chráňte zdieľaný stav výberu a odlišujte výber trasy od pozorovania jej výstupu.
Selektor môže dokonale striedať a napriek tomu stále vyberať prvý proxy. Chyba je v tom, že sa pre každú požiadavku omylom vytvorí nový selektor, ktorý vynuluje svoj počítadlo skôr, než stihne urobiť druhý výber.
Vytvorte selektor raz a udržujte ho spolu s transportom. Zoznam HTTP proxy môže poskytnúť verejných HTTP kandidátov pre množinu URL, keď požiadavky povoľujú verejných sprostredkovateľov. Začnite s už overeným, neprázdnym zoznamom URL proxy:
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
}
}
Okolitá aplikácia musí odmietnuť prázdny zoznam, overiť URL a použiť bežné importy net/http, net/url a sync. Zoznam by mal zostať nezmenený, kým ho tento selektor používa, alebo by mal byť nahradený samostatne synchronizovaným návrhom.
Pripojte vrátenú funkciu k jednému uchovávanému http.Transport. Mutex chráni postupnosť výberu naprieč súbežnými spätnými volaniami. Nevyžaduje držanie zámku, kým sa dokončuje pomalá sieťová požiadavka.
Nespotrebúvajte trasu len preto, aby ste ju vypísali
Opätovné volanie selektora pre diagnostickú správu znova posunie počítadlo. Takýto výstup môže opísať ďalšieho kandidáta namiesto kandidáta, ktorého použila skúmaná požiadavka. Zaznamenajte výber vnútri skutočného spätného volania pomocou bezpečného identifikátora koncového bodu.
Vyvolanie spätného volania nie je dôkazom úspešného doručenia požiadavky. Presmerovania alebo ďalšie pokusy transportu môžu skomplikovať jednoduchý predpoklad „jedno volanie aplikácie, jeden výber“. Ak pracovný postup musí udržať jednu trasu počas viacerých operácií, vyberte túto trasu na hranici pracovného postupu namiesto používania globálneho rotujúceho spätného volania.
Kruhové striedanie tiež nesľubuje odlišné verejné výstupy. Rozvrhuje koncové body. Konečná identita zostáva vlastnosťou cesty, ktorú poskytuje každý koncový bod.