Агульны цыклічны селектар проксі на Go
Трымайце селектар проксі Go жывым паміж запытамі, абараняйце агульны стан выбару і адрознівайце выбар маршруту ад назірання за яго выхадам.
Селектар можа ідэальна чаргавацца і ўсё роўна выбіраць першы проксі. Памылка ў тым, што для кожнага запыту выпадкова ствараецца новы селектар, які скідвае свой лічыльнік яшчэ да таго, як з’явіцца другі варыянт выбару.
Стварыце селектар адзін раз і трымайце яго разам з транспартам. Спіс HTTP-проксі можа даць публічныя HTTP-кандыдаты для набору URL, калі запыты дазваляюць публічных пасрэднікаў. Пачніце з ужо праверанага, непустога спісу URL проксі:
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
}
}
Навакольнае прыкладанне павінна адхіляць пусты спіс, правяраць URL і выкарыстоўваць звычайныя імпарты net/http, net/url і sync. Спіс павінен заставацца нязменным, пакуль селектар ім карыстаецца, або замяняцца праз асобную сінхранізаваную схему.
Далучыце вернутую функцыю да аднаго захаванага http.Transport. М’юцех абараняе паслядоўнасць выбару пры адначасовых зваротных выкліках. Ён не патрабуе ўтрымання блакіроўкі, пакуль завяршаецца павольны сеткавы запыт.
Не выбірайце маршрут толькі дзеля вываду
Паўторны выклік селектара для дыягнастычнага паведамлення зноў прасоўвае лічыльнік. Гэты вывад можа апісваць наступнага кандыдата, а не таго, якога выкарыстаў запыт, які вы даследуеце. Фіксуйце выбар унутры сапраўднага зваротнага выкліку з дапамогай бяспечнага ідэнтыфікатара канчатковай кропкі.
Выклік зваротнай функцыі не з’яўляецца доказам паспяхова дастаўленага запыту. Перанакіраванні або дадатковыя спробы транспарту могуць ускладніць простае меркаванне «адзін выклік прыкладання — адзін выбар». Калі працоўны працэс павінен захоўваць адзін маршрут на працягу некалькіх аперацый, выбірайце гэты маршрут на мяжы працоўнага працэсу, а не выкарыстоўвайце глабальны цыклічны зваротны выклік.
Цыклічнае чаргаванне таксама не абяцае розных публічных выхадаў. Яно плануе канчатковыя кропкі. Канчатковая ідэнтычнасць застаецца ўласцівасцю шляху, які падае кожная канчатковая кропка.