Споделен кръгов селектор на прокси в 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. Мутексът защитава последователността на избор при едновременни обратни извиквания. Не изисква задържане на ключалка, докато приключва бавна мрежова заявка.
Не изразходвайте маршрут само за да го отпечатате
Повторното извикване на селектора за диагностично съобщение отново придвижва брояча. Този изход може да опише следващия кандидат, а не кандидата, използван от заявката, която изследвате. Записвайте избора в истинското обратно извикване с безопасен идентификатор на крайна точка.
Извикването на обратно извикване не е доказателство за успешно доставена заявка. Пренасочванията или допълнителните опити за транспорт могат да усложнят простото допускане „едно извикване на приложението, един избор“. Ако работен поток трябва да запази един маршрут през няколко операции, изберете този маршрут на границата на работния поток, вместо да използвате глобално въртящо се обратно извикване.
Кръговото редуване също не обещава различни публични изходи. То планира крайни точки. Крайната идентичност остава свойство на пътя, който предоставя всяка крайна точка.