’n Gedeelde rondlopende proxy-kieser in Go
Hou ’n Go-proxy-kieser oor versoeke heen lewendig, beskerm gedeelde keusetoestand en onderskei die kies van ’n roete van die waarneem van sy uitgang.
’n Kieser kan heeltemal reg ronddraai en steeds die eerste proxy kies. Die fout is om per ongeluk vir elke versoek ’n nuwe kieser te skep, wat sy teller terugstel voordat hy ’n tweede keuse kan maak.
Skep die kieser een keer en hou dit saam met die transport. Die HTTP-proxylys kan openbare HTTP-kandidate vir die URL-stel lewer wanneer die versoeke openbare tussenstappe toelaat. Begin met ’n reeds gevalideerde, nie-leë lys van proxy-URL’s:
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
}
}
Die omringende toepassing moet ’n leë lys verwerp, die URL’s valideer en die normale invoere net/http, net/url en sync gebruik. Die lys moet onveranderlik bly terwyl hierdie kieser dit gebruik, of deur ’n afsonderlik gesinkroniseerde ontwerp vervang word.
Heg die teruggekeerde funksie aan een behoue http.Transport. Die mutex beskerm die keusereeks oor gelyktydige terugroepe. Dit vereis nie dat ’n slot gehou word terwyl ’n stadige netwerkversoek voltooi nie.
Moenie ’n roete verbruik net om dit te druk nie
As jy die kieser weer vir ’n diagnostiese boodskap roep, word die teller weer verhoog. Daardie uitset beskryf dalk die volgende kandidaat eerder as die kandidaat wat die versoek wat jy ondersoek, gebruik het. Teken die keuse binne die werklike terugroep op met ’n veilige eindpunt-identifiseerder.
’n Terugroepaanroep is nie bewys van ’n suksesvol afgelewerde versoek nie. Herverwysings of bykomende transportpogings kan ’n eenvoudige aanname van “een toepassingsoproep, een keuse” bemoeilik. As ’n werkvloei een roete deur verskeie bewerkings heen moet hou, kies daardie roete by die werkvloei-grens eerder as om ’n globale roterende terugroep te gebruik.
Rondlopend belowe ook nie afsonderlike openbare uitgange nie. Dit skeduleer eindpunte. Die finale identiteit bly ’n eienskap van die pad wat elke eindpunt verskaf.