Un selector de proxy round-robin partajat în Go
Mențineți viu un selector de proxy Go între cereri, protejați starea de selecție partajată și distingeți alegerea unei rute de observarea ieșirii acesteia.
Un selector poate roti perfect și tot poate alege primul proxy. Greșeala este crearea accidentală a unui selector nou pentru fiecare cerere, ceea ce îi resetează contorul înainte de a avea o a doua alegere.
Construiți selectorul o singură dată și păstrați-l împreună cu transportul. Lista de proxy-uri HTTP poate furniza candidați HTTP publici pentru setul de URL-uri atunci când cererile permit intermediari publici. Începeți cu o listă de URL-uri de proxy deja validată și nevidă:
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
}
}
Aplicația din jur trebuie să respingă o listă goală, să valideze URL-urile și să folosească importurile normale net/http, net/url și sync. Lista ar trebui să rămână neschimbată cât timp acest selector o folosește, sau să fie înlocuită printr-un design sincronizat separat.
Atașați funcția returnată la un singur http.Transport păstrat. Mutexul protejează secvența de selecție între apeluri inverse concurente. Nu necesită ținerea unui lacăt în timp ce o cerere de rețea lentă se finalizează.
Nu consuma o rută doar ca să o tipărești
Apelarea din nou a selectorului pentru un mesaj de diagnostic avansează din nou contorul. Acea ieșire poate descrie următorul candidat în locul candidatului folosit de cererea pe care o investigați. Înregistrați selecția în interiorul apelului invers real, cu un identificator sigur de punct final.
Invocarea unui apel invers nu este dovada că o cerere a fost livrată cu succes. Redirecționările sau încercările suplimentare de transport pot complica presupunerea simplă „un apel al aplicației, o alegere”. Dacă un flux de lucru trebuie să păstreze o rută pe parcursul mai multor operații, alegeți acea rută la granița fluxului de lucru în loc să folosiți un apel invers rotativ global.
Round-robin nu promite nici ieșiri publice distincte. Programează puncte finale. Identitatea finală rămâne o proprietate a căii pe care o furnizează fiecare punct final.