Megosztott körkörös proxyválasztó Go-ban
Tartsa életben a Go proxyválasztót a kérések között, védje a megosztott kiválasztási állapotot, és különböztesse meg az útvonal kiválasztását annak kimenetének megfigyelésétől.
Egy választó tökéletesen körbeérhet, és mégis folyton az első proxyt választhatja. A hiba, hogy minden kéréshez véletlenül új választó jön létre, ami nullázza a számlálót, mielőtt második választásra kerülne sor.
A választót egyszer állítsa elő, és tartsa meg a transzport mellett. Az HTTP-proxy lista nyilvános HTTP-jelölteket adhat az URL-halmazhoz, amikor a kérések megengedik a nyilvános közvetítőket. Kezdje egy már ellenőrzött, nem üres proxy URL-listával:
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 környező alkalmazásnak el kell utasítania az üres listát, ellenőriznie kell az URL-eket, és a szokásos net/http, net/url és sync importokat kell használnia. A listának változatlannak kell maradnia, amíg ez a választó használja, vagy külön szinkronizált tervezéssel kell lecserélni.
Csatolja a visszaadott függvényt egy megtartott http.Transport-hoz. A mutex védi a kiválasztási sorrendet az egyidejű visszahívások között. Nem igényli zár tartását, miközben egy lassú hálózati kérés befejeződik.
Ne fogyasszon el egy útvonalat csak azért, hogy kiírja
A választó újbóli meghívása diagnosztikai üzenethez ismét továbblépteti a számlálót. Az a kimenet a következő jelöltet írhatja le ahelyett, amelyet a vizsgált kérés használt. Rögzítse a kiválasztást a valódi visszahíváson belül egy biztonságos végpontazonosítóval.
Egy visszahívás meghívása nem bizonyítja, hogy a kérés sikeresen kézbesítésre került. Az átirányítások vagy a további transzportkísérletek bonyolíthatják az „egy alkalmazáshívás, egy választás” egyszerű feltevését. Ha egy munkafolyamatnak több műveleten át fenn kell tartania egy útvonalat, válassza ki ezt az útvonalat a munkafolyamat határán a globális forgó visszahívás helyett.
A körkörös váltás sem ígér különböző nyilvános kimeneteket. Végpontokat ütemez. A végső identitás továbbra is az egyes végpontok által nyújtott útvonal tulajdonsága marad.