Um seletor pode rodar perfeitamente e continuar escolhendo o primeiro proxy. O erro é criar acidentalmente um novo seletor para cada requisição, o que zera o contador antes que ele tenha uma segunda escolha a fazer.

Construa o seletor uma vez e mantenha-o com o transporte. A lista de proxies HTTP pode fornecer candidatos HTTP públicos para o conjunto de URLs quando as requisições permitem intermediários públicos. Comece com uma lista de URLs de proxy já validada e não vazia:

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

A aplicação ao redor deve rejeitar uma lista vazia, validar as URLs e usar as importações normais net/http, net/url e sync. A lista deve permanecer imutável enquanto este seletor a usa, ou ser substituída por um desenho sincronizado separadamente.

Anexe a função retornada a um único http.Transport retido. O mutex protege a sequência de seleção entre callbacks concorrentes. Ele não exige manter um bloqueio enquanto uma requisição de rede lenta termina.

Não consuma uma rota só para imprimi-la

Chamar o seletor novamente para uma mensagem de diagnóstico avança o contador de novo. Essa saída pode descrever o próximo candidato em vez do candidato usado pela requisição que você está investigando. Registre a seleção dentro do callback real com um identificador de endpoint seguro.

Uma invocação de callback não é prova de que uma requisição foi entregue com sucesso. Redirecionamentos ou tentativas de transporte adicionais podem complicar a suposição simples de «uma chamada da aplicação, uma escolha». Se um fluxo de trabalho precisar manter uma rota ao longo de várias operações, escolha essa rota na fronteira do fluxo de trabalho em vez de usar um callback rotativo global.

O round-robin também não promete saídas públicas distintas. Ele agenda endpoints. A identidade final continua sendo uma propriedade do caminho que cada endpoint fornece.

Artigos relacionados