Sdílený kruhový volič proxy v Go
Udržujte volič proxy v Go živý mezi požadavky, chraňte sdílený stav volby a rozlišujte volbu trasy od pozorování jejího výstupu.
Volič může dokonale střídat a přesto stále volit první proxy. Chyba spočívá v tom, že se pro každý požadavek omylem vytvoří nový volič, který vynuluje svůj čítač dřív, než stihne udělat druhou volbu.
Vytvořte volič jednou a udržujte jej spolu s transportem. Seznam HTTP proxy může poskytnout veřejné HTTP kandidáty pro sadu URL, pokud požadavky dovolují veřejné prostředníky. Začněte s již ověřeným, neprázdným seznamem 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
}
}
Obklopující aplikace musí odmítnout prázdný seznam, ověřit URL a použít běžné importy net/http, net/url a sync. Seznam by měl zůstat neměnný, dokud jej tento volič používá, nebo být nahrazen samostatně synchronizovaným návrhem.
Připojte vrácenou funkci k jednomu uchovávanému http.Transport. Mutex chrání posloupnost volby napříč souběžnými zpětnými voláními. Nevyžaduje držení zámku, dokud se dokončuje pomalý síťový požadavek.
Nespotřebovávejte trasu jen proto, abyste ji vypsali
Opětovné volání voliče kvůli diagnostické zprávě znovu posune čítač. Takový výstup může popisovat dalšího kandidáta místo kandidáta, který použil zkoumaný požadavek. Zaznamenejte volbu uvnitř skutečného zpětného volání pomocí bezpečného identifikátoru koncového bodu.
Vyvolání zpětného volání není důkazem úspěšně doručeného požadavku. Přesměrování nebo další pokusy transportu mohou zkomplikovat jednoduchý předpoklad „jedno volání aplikace, jedna volba“. Pokud pracovní postup musí udržet jednu trasu během několika operací, zvolte tuto trasu na hranici pracovního postupu, místo abyste používali globální rotující zpětné volání.
Kruhové střídání také neslibuje odlišné veřejné výstupy. Rozvrhuje koncové body. Konečná identita zůstává vlastností cesty, kterou každý koncový bod poskytuje.