Dijeljeni kružni birač proxyja u Gou
Održavajte Go birač proxyja živim između zahtjeva, zaštitite dijeljeno 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 zahtjev, što resetuje njegov brojač prije nego što stigne napraviti 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 zahtjevi dopuštaju javne posrednike. Počnite s već provjerenom, 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
}
}
Okvirna aplikacija mora odbiti praznu listu, provjeriti URL-ove i koristiti uobičajene uvoze net/http, net/url i sync. Lista treba ostati nepromjenjiva dok je ovaj birač koristi ili biti zamijenjena kroz posebno sinhronizovan dizajn.
Pričvrstite vraćenu funkciju na jedan zadržani http.Transport. Mutex štiti redoslijed odabira kroz istovremene povratne pozive. Ne zahtijeva držanje brave dok se spori mrežni zahtjev završava.
Ne trošite rutu samo da biste je ispisali
Ponovni poziv birača radi dijagnostičke poruke ponovo pomjera brojač. Taj izlaz može opisati sljedećeg kandidata umjesto kandidata kojeg je koristio zahtjev koji istražujete. Zabilježite odabir unutar stvarnog povratnog poziva koristeći siguran identifikator krajnje točke.
Poziv povratnog poziva nije dokaz da je zahtjev uspješno dostavljen. Preusmjeravanja 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 umjesto korištenja globalnog rotirajućeg povratnog poziva.
Kruženje takođe ne obećava različite javne izlaze. Ono zakazuje krajnje točke. Konačni identitet ostaje svojstvo puta koji pruža svaka krajnja točka.