Dijeljeni kružni birač proxyja u Gou
Održavajte Go birač proxyja živim između zahteva, zaštitite deljeno stanje odabira i razlikujte biranje rute od posmatranja njenog izlaza.
Birač može savršeno kružiti i ipak stalno birati prvi proxy. Greška je slučajno stvaranje novog birača za svaki zahtev, što resetuje njegov brojač pre nego što stigne da napravi drugi izbor.
Konstruišite birač jednom i zadržite ga uz transport. Lista HTTP proxyja može dati javne HTTP kandidate za skup URL-ova kada zahtevi dozvoljavaju javne posrednike. Počnite sa već proverenom, nepraznom listom URL-ova proxyja:
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
}
}
Okolna aplikacija mora odbiti praznu listu, proveriti URL-ove i koristiti uobičajene uvoze net/http, net/url i sync. Lista bi trebalo da ostane nepromenljiva dok je ovaj birač koristi ili da bude zamenjena kroz posebno sinhronizovan dizajn.
Pričvrstite vraćenu funkciju na jedan zadržani http.Transport. Mutex štiti redosled odabira kroz istovremene povratne pozive. Ne zahteva držanje brave dok se spori mrežni zahtev završava.
Ne trošite rutu samo da biste je ispisali
Ponovni poziv birača radi dijagnostičke poruke ponovo pomera brojač. Taj izlaz može opisati sledećeg kandidata umesto kandidata kog je koristio zahtev koji istražujete. Zabeležite odabir unutar stvarnog povratnog poziva sa sigurnim identifikatorom krajnje tačke.
Poziv povratnog poziva nije dokaz da je zahtev uspešno dostavljen. Preusmeravanja ili dodatni pokušaji transporta mogu zakomplikovati jednostavnu pretpostavku „jedan poziv aplikacije, jedan odabir“. Ako radni tok mora zadržati jednu rutu kroz nekoliko operacija, odaberite tu rutu na granici radnog toka umesto korišćenja globalnog rotirajućeg povratnog poziva.
Kruženje takođe ne obećava različite javne izlaze. Ono planira krajnje tačke. Konačni identitet ostaje svojstvo puta koji pruža svaka krajnja tačka.