Birač može savršeno kružiti i pritom stalno birati prvi proxy. Pogreška je slučajno stvaranje novog birača za svaki zahtjev, što resetira njegov brojač prije nego što stigne napraviti drugi izbor.

Konstruirajte birač jednom i zadržite ga uz transport. Popis HTTP proxyja može dati javne HTTP kandidate za skup URL-ova kada zahtjevi dopuštaju javne posrednike. Počnite s već provjerenim, nepraznim popisom URL-ova proxyja:

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
    }
}

Okolna aplikacija mora odbiti prazan popis, provjeriti URL-ove i koristiti uobičajene uvoze net/http, net/url i sync. Popis bi trebao ostati nepromjenjiv dok ga ovaj birač koristi ili biti zamijenjen zasebno sinkroniziranim dizajnom.

Pričvrstite vraćenu funkciju na jedan zadržani http.Transport. Mutex štiti slijed odabira kroz istodobne povratne pozive. Ne zahtijeva držanje brave dok se spori mrežni zahtjev dovršava.

Ne trošite rutu samo da biste je ispisali

Ponovni poziv birača radi dijagnostičke poruke ponovno pomiče brojač. Taj izlaz može opisati sljedećeg kandidata umjesto kandidata kojeg je koristio zahtjev koji istražujete. Zabilježite odabir unutar stvarnog povratnog poziva sa sigurnim identifikatorom krajnje točke.

Poziv povratnog poziva nije dokaz da je zahtjev uspješno dostavljen. Preusmjeravanja ili dodatni pokušaji transporta mogu zakomplicirati jednostavnu pretpostavku „jedan poziv aplikacije, jedan odabir“. Ako radni tok mora zadržati jednu rutu kroz nekoliko operacija, odaberite tu rutu na granici radnog toka umjesto korištenja globalnog rotirajućeg povratnog poziva.

Kruženje također ne obećava različite javne izlaze. Ono planira krajnje točke. Konačni identitet ostaje svojstvo puta koji pruža svaka krajnja točka.

Povezani članci