Koplietots apļveida Go starpniekservera atlasītājs
Uzturiet Go starpniekservera atlasītāju dzīvu starp pieprasījumiem, aizsargājiet koplietoto atlases stāvokli un atšķiriet maršruta izvēli no tā izejas novērošanas.
Atlasītājs var perfekti rotēt un tomēr turpināt izvēlēties pirmo starpniekserveri. Kļūda ir nejauši izveidot jaunu atlasītāju katram pieprasījumam, kas atiestata tā skaitītāju, pirms tam ir otra izvēle.
Izveidojiet atlasītāju vienu reizi un saglabājiet to kopā ar transportu. HTTP starpniekserveru saraksts var nodrošināt publiskus HTTP kandidātus URL kopai, ja pieprasījumi atļauj publiskus starpniekus. Sāciet ar jau validētu, ne tukšu starpniekserveru URL sarakstu:
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
}
}
Apkārtējai lietojumprogrammai ir jānoraida tukšs saraksts, jāvalidē URL un jāizmanto parastie net/http, net/url un sync importi. Sarakstam jāpaliek nemainīgam, kamēr šis atlasītājs to izmanto, vai arī tas jāaizstāj ar atsevišķi sinhronizētu risinājumu.
Pievienojiet atgriezto funkciju vienam saglabātam http.Transport. Mutex aizsargā atlases secību starp vienlaicīgiem atzvanīšanas izsaukumiem. Tas neprasa turēt slēdzeni, kamēr tiek pabeigts lēns tīkla pieprasījums.
Netērējiet maršrutu tikai tā izdrukāšanai
Atkārtota atlasītāja izsaukšana diagnostikas ziņojumam atkal pavirza skaitītāju. Šī izvade var aprakstīt nākamo kandidātu, nevis to, ko izmantoja pētāmais pieprasījums. Ierakstiet atlasi īstajā atzvanīšanas izsaukumā, izmantojot drošu galapunkta identifikatoru.
Atzvanīšanas izsaukums nav pierādījums tam, ka pieprasījums ir veiksmīgi piegādāts. Pārvirzīšana vai papildu transporta mēģinājumi var sarežģīt vienkāršu pieņēmumu „viens lietojumprogrammas izsaukums, viena izvēle“. Ja darbplūsmai ir jāsaglabā viens maršruts vairākās operācijās, izvēlieties šo maršrutu darbplūsmas robežā, nevis izmantojiet globālu rotējošu atzvanīšanas izsaukumu.
Apļveida rotācija arī nesola atšķirīgas publiskas izejas. Tā plāno galapunktus. Galīgā identitāte paliek tā ceļa īpašība, ko nodrošina katrs galapunkts.