Un selettore può ruotare perfettamente e continuare comunque a scegliere il primo proxy. L’errore è creare accidentalmente un nuovo selettore per ogni richiesta, il che azzera il suo contatore prima che abbia una seconda scelta da fare.

Costruisci il selettore una volta e tienilo insieme al transport. La lista di proxy HTTP può fornire candidati HTTP pubblici per l’insieme di URL quando le richieste consentono intermediari pubblici. Parti da un elenco di URL proxy già convalidato e non vuoto:

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

L’applicazione circostante deve rifiutare un elenco vuoto, convalidare gli URL e usare le normali importazioni net/http, net/url e sync. L’elenco dovrebbe restare immutabile mentre questo selettore lo usa, oppure essere sostituito tramite un progetto sincronizzato separatamente.

Collega la funzione restituita a un unico http.Transport mantenuto. Il mutex protegge la sequenza di selezione tra callback concorrenti. Non richiede di tenere un lock mentre una richiesta di rete lenta si completa.

Non consumare una rotta solo per stamparla

Richiamare il selettore per un messaggio diagnostico fa avanzare di nuovo il contatore. Quell’output può descrivere il candidato successivo invece del candidato usato dalla richiesta che stai esaminando. Registra la selezione dentro il callback reale con un identificatore di endpoint sicuro.

L’invocazione di un callback non è prova che una richiesta sia stata consegnata con successo. Reindirizzamenti o tentativi di transport aggiuntivi possono complicare la semplice ipotesi «una chiamata dell’applicazione, una scelta». Se un flusso di lavoro deve mantenere una rotta attraverso più operazioni, scegli quella rotta al confine del flusso di lavoro invece di usare un callback rotante globale.

Il round-robin inoltre non promette uscite pubbliche distinte. Pianifica endpoint. L’identità finale resta una proprietà del percorso fornito da ciascun endpoint.

Articoli correlati