Een gedeelde round-robin-proxyselector in Go
Houd een Go-proxyselector levend tussen verzoeken, bescherm de gedeelde selectiestatus en onderscheid het kiezen van een route van het waarnemen van de uitgang ervan.
Een selector kan perfect rondgaan en toch steeds de eerste proxy kiezen. De fout is per ongeluk een nieuwe selector per verzoek te maken, waardoor de teller wordt gereset voordat er een tweede keuze is.
Bouw de selector één keer en houd hem bij de transport. De HTTP-proxylijst kan openbare HTTP-kandidaten leveren voor de URL-set wanneer de verzoeken openbare tussenpersonen toestaan. Begin met een al gevalideerde, niet-lege lijst met 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
}
}
De omringende applicatie moet een lege lijst weigeren, de URL’s valideren en de normale imports net/http, net/url en sync gebruiken. De lijst moet onveranderlijk blijven terwijl deze selector hem gebruikt, of worden vervangen via een apart gesynchroniseerd ontwerp.
Koppel de teruggegeven functie aan één aangehouden http.Transport. De mutex beschermt de selectiereeks tussen gelijktijdige callbacks. Het vereist niet dat een slot wordt vastgehouden terwijl een traag netwerkverzoek voltooit.
Verbruik geen route alleen om hem af te drukken
De selector opnieuw aanroepen voor een diagnosemelding laat de teller opnieuw opschuiven. Die uitvoer beschrijft misschien de volgende kandidaat in plaats van de kandidaat die het verzoek dat je onderzoekt gebruikte. Leg de selectie vast binnen de echte callback met een veilige eindpuntidentificatie.
Een callback-aanroep is geen bewijs dat een verzoek met succes is afgeleverd. Omleidingen of extra transportpogingen kunnen een eenvoudige aanname van ‘één applicatieaanroep, één keuze’ bemoeilijken. Als een werkstroom één route door meerdere bewerkingen moet vasthouden, kies die route dan bij de grens van de werkstroom in plaats van een wereldwijd roterende callback te gebruiken.
Round-robin belooft ook geen afzonderlijke openbare uitgangen. Het plant eindpunten. De uiteindelijke identiteit blijft een eigenschap van het pad dat elk eindpunt levert.