Komuna laŭvica proksea selektilo en Go
Tenu Go-proksean selektilon viva inter petoj, protektu la komunan selekciostaton kaj distinguj la elekton de itinero disde la observado de ĝia eliro.
Selektilo povas perfekte sinsekvigi kaj tamen daŭre elekti la unuan prokseon. La eraro konsistas en hazarda kreado de nova selektilo por ĉiu peto, kio restarigas ĝian nombrilon antaŭ ol ĝi havas duan elekton.
Konstruu la selektilon unufoje kaj retenu ĝin kun la transporto. La HTTP-proksea listo povas provizi publikajn HTTP-kandidatojn por la URL-aro kiam la petoj permesas publikajn perantojn. Komencu per jam validigita, malplena ne lista de prokseaj URL-oj:
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
}
}
La ĉirkaŭa aplikaĵo devas malakcepti malplenan liston, validigi la URL-ojn kaj uzi la normalajn importojn net/http, net/url kaj sync. La listo devus resti senŝanĝa dum ĉi tiu selektilo uzas ĝin, aŭ esti anstataŭigita per aparte sinkronigita dezajno.
Alligu la redonitan funkcion al unu retenata http.Transport. La mutexo protektas la selekciosekvencon inter samtempaj retrovokoj. Ĝi ne postulas teni ŝlosilon dum malrapida reta peto finiĝas.
Ne konsumu itineron nur por presi ĝin
Revoki la selektilon por diagnoza mesaĝo denove antaŭeniras la nombrilon. Tiu eligilo eble priskribas la sekvan kandidaton anstataŭ la kandidaton uzitan de la peto, kiun vi esploras. Registru la elekton ene de la reala retrovoko per sekura finpunkta identigilo.
Retrovoka alvoko ne pruvas sukcesan liveron de peto. Alidirektadoj aŭ pliaj transportaj provoj povas kompliki simplan supozon „unu aplikaĵa alvoko, unu elekto“. Se laborfluo devas konservi unu itineron tra pluraj operacioj, elektu tiun itineron ĉe la limo de la laborfluo anstataŭ uzi tutmondan rotacian retrovokon.
Laŭvica rotacio ankaŭ ne promesas malsamajn publikajn elirojn. Ĝi planas finpunktojn. La fina identeco restas eco de la vojo, kiun provizas ĉiu finpunkto.