Współdzielony okrężny selektor proxy w Go
Utrzymuj selektor proxy Go przy życiu między żądaniami, chroń współdzielony stan wyboru i odróżniaj wybór trasy od obserwacji jej wyjścia.
Selektor może rotować idealnie i wciąż wybierać pierwsze proxy. Błąd polega na przypadkowym tworzeniu nowego selektora dla każdego żądania, co zeruje jego licznik, zanim będzie miał drugi wybór.
Zbuduj selektor raz i zachowaj go razem z transportem. Lista proxy HTTP może dostarczyć publiczne kandydatury HTTP dla zbioru URL, gdy żądania dopuszczają publiczne pośredniki. Zacznij od już zweryfikowanej, niepustej listy URL proxy:
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
}
}
Otaczająca aplikacja musi odrzucać pustą listę, weryfikować adresy URL i używać zwykłych importów net/http, net/url i sync. Lista powinna pozostać niezmienna, dopóki ten selektor jej używa, albo zostać zastąpiona przez osobno zsynchronizowany projekt.
Dołącz zwróconą funkcję do jednego utrzymywanego http.Transport. Mutex chroni sekwencję wyboru między współbieżnymi wywołaniami zwrotnymi. Nie wymaga trzymania blokady, gdy kończy się wolne żądanie sieciowe.
Nie zużywaj trasy tylko po to, by ją wydrukować
Ponowne wywołanie selektora dla komunikatu diagnostycznego ponownie przesuwa licznik. Ten wynik może opisywać następnego kandydata zamiast kandydata użytego przez badane żądanie. Zapisz wybór wewnątrz rzeczywistego wywołania zwrotnego, używając bezpiecznego identyfikatora punktu końcowego.
Wywołanie zwrotne nie jest dowodem, że żądanie zostało pomyślnie dostarczone. Przekierowania lub dodatkowe próby transportu mogą komplikować proste założenie „jedno wywołanie aplikacji, jeden wybór”. Jeśli przepływ pracy musi zachować jedną trasę przez kilka operacji, wybierz tę trasę na granicy przepływu pracy zamiast używać globalnego rotującego wywołania zwrotnego.
Rotacja okrężna nie obiecuje też odrębnych publicznych wyjść. Planuje punkty końcowe. Ostateczna tożsamość pozostaje właściwością ścieżki dostarczanej przez każdy punkt końcowy.