Спільний циклічний селектор проксі на 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. М’ютекс захищає послідовність вибору між одночасними зворотними викликами. Він не вимагає утримувати блокування, поки завершується повільний мережевий запит.
Не витрачайте маршрут лише для того, щоб його надрукувати
Повторний виклик селектора для діагностичного повідомлення знову просуває лічильник. Цей вивід може описувати наступного кандидата замість кандидата, який використав досліджуваний запит. Фіксуйте вибір усередині справжнього зворотного виклику з безпечним ідентифікатором кінцевої точки.
Виклик зворотного виклику не є доказом того, що запит було успішно доставлено. Переспрямування або додаткові спроби транспорту можуть ускладнити просте припущення «один виклик застосунку — один вибір». Якщо робочому процесу потрібно зберегти один маршрут протягом кількох операцій, вибирайте цей маршрут на межі робочого процесу, а не використовуйте глобальний обертовий зворотний виклик.
Циклічне чергування також не обіцяє різних публічних виходів. Воно планує кінцеві точки. Остаточна ідентичність залишається властивістю шляху, який надає кожна кінцева точка.