Un sélecteur peut tourner parfaitement et continuer à choisir le premier proxy. L’erreur consiste à créer accidentellement un nouveau sélecteur à chaque requête, ce qui remet son compteur à zéro avant qu’il ait un second choix à faire.

Construisez le sélecteur une fois et conservez-le avec le transport. La liste de proxys HTTP peut fournir des candidats HTTP publics pour l’ensemble d’URL lorsque les requêtes autorisent des intermédiaires publics. Partez d’une liste d’URL de proxy déjà validée et non vide :

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’application englobante doit rejeter une liste vide, valider les URL et utiliser les imports normaux net/http, net/url et sync. La liste devrait rester immuable pendant que ce sélecteur l’utilise, ou être remplacée par une conception synchronisée séparément.

Attachez la fonction renvoyée à un seul http.Transport conservé. Le mutex protège la séquence de sélection entre rappels concurrents. Il n’exige pas de garder un verrou pendant qu’une requête réseau lente s’achève.

Ne consommez pas une route simplement pour l’afficher

Rappeler le sélecteur pour un message de diagnostic fait à nouveau avancer le compteur. Cette sortie peut décrire le candidat suivant plutôt que celui utilisé par la requête que vous examinez. Enregistrez la sélection dans le vrai rappel avec un identifiant de point de terminaison sûr.

L’invocation d’un rappel ne prouve pas qu’une requête a été livrée avec succès. Les redirections ou les tentatives de transport supplémentaires peuvent compliquer l’hypothèse simple « un appel applicatif, un choix ». Si un flux de travail doit conserver une route pendant plusieurs opérations, choisissez cette route à la frontière du flux de travail au lieu d’utiliser un rappel rotatif global.

Le round-robin ne promet pas non plus des sorties publiques distinctes. Il planifie des points de terminaison. L’identité finale reste une propriété du chemin que fournit chaque point de terminaison.

Articles similaires