Un selector de proxy round-robin compartido en Go
Mantén vivo un selector de proxy de Go entre peticións, protexe o estado de selección compartido e distingue escoller unha ruta de observar a súa saída.
Un selector pode rotar perfectamente e aínda así seguir escollendo o primeiro proxy. O fallo está en crear accidentalmente un novo selector por cada petición, o que reinicia o seu contador antes de que poida facer unha segunda escolla.
Constrúe o selector unha vez e manteno co transporte. A lista de proxies HTTP pode fornecer candidatos HTTP públicos para o conxunto de URL cando as peticións permiten intermediarios públicos. Comeza cunha lista de URL de proxy xa validada e non baleira:
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
}
}
A aplicación circundante debe rexeitar unha lista baleira, validar as URL e usar as importacións normais net/http, net/url e sync. A lista debería permanecer inmutable mentres este selector a usa, ou substituírse mediante un deseño sincronizado por separado.
Conecta a función devolta a un único http.Transport retido. O mutex protexe a secuencia de selección entre devolucións de chamada simultáneas. Non esixe manter un bloqueo mentres se completa unha petición de rede lenta.
Non consumas unha ruta só para imprimila
Volver chamar o selector para unha mensaxe de diagnóstico avanza o contador outra vez. Esa saída pode describir o seguinte candidato en lugar do candidato usado pola petición que estás a investigar. Rexistra a selección dentro da devolución de chamada real cun identificador de extremo seguro.
Unha invocación de devolución de chamada non proba que unha petición se entregase correctamente. As redireccións ou os intentos de transporte adicionais poden complicar unha suposición simple de «unha chamada da aplicación, unha escolla». Se un fluxo de traballo debe conservar unha ruta durante varias operacións, escoller esa ruta no límite do fluxo de traballo en lugar de usar unha devolución de chamada rotatoria global.
O round-robin tampouco promete saídas públicas distintas. Programa extremos. A identidade final segue sendo unha propiedade da ruta que fornece cada extremo.