Un selector poate roti perfect și tot poate alege primul proxy. Greșeala este crearea accidentală a unui selector nou pentru fiecare cerere, ceea ce îi resetează contorul înainte de a avea o a doua alegere.

Construiți selectorul o singură dată și păstrați-l împreună cu transportul. Lista de proxy-uri HTTP poate furniza candidați HTTP publici pentru setul de URL-uri atunci când cererile permit intermediari publici. Începeți cu o listă de URL-uri de proxy deja validată și nevidă:

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

Aplicația din jur trebuie să respingă o listă goală, să valideze URL-urile și să folosească importurile normale net/http, net/url și sync. Lista ar trebui să rămână neschimbată cât timp acest selector o folosește, sau să fie înlocuită printr-un design sincronizat separat.

Atașați funcția returnată la un singur http.Transport păstrat. Mutexul protejează secvența de selecție între apeluri inverse concurente. Nu necesită ținerea unui lacăt în timp ce o cerere de rețea lentă se finalizează.

Nu consuma o rută doar ca să o tipărești

Apelarea din nou a selectorului pentru un mesaj de diagnostic avansează din nou contorul. Acea ieșire poate descrie următorul candidat în locul candidatului folosit de cererea pe care o investigați. Înregistrați selecția în interiorul apelului invers real, cu un identificator sigur de punct final.

Invocarea unui apel invers nu este dovada că o cerere a fost livrată cu succes. Redirecționările sau încercările suplimentare de transport pot complica presupunerea simplă „un apel al aplicației, o alegere”. Dacă un flux de lucru trebuie să păstreze o rută pe parcursul mai multor operații, alegeți acea rută la granița fluxului de lucru în loc să folosiți un apel invers rotativ global.

Round-robin nu promite nici ieșiri publice distincte. Programează puncte finale. Identitatea finală rămâne o proprietate a căii pe care o furnizează fiecare punct final.

Articole similare