Sebuah pemilih dapat berotasi dengan sempurna dan tetap terus memilih proksi pertama. Kesalahannya adalah tanpa sengaja membuat pemilih baru untuk setiap permintaan, yang mereset penghitungnya sebelum ia sempat membuat pilihan kedua.

Bangun pemilih sekali dan pertahankan bersama transport. Daftar proksi HTTP dapat menyediakan kandidat HTTP publik untuk kumpulan URL ketika permintaan mengizinkan perantara publik. Mulailah dengan daftar URL proksi yang sudah tervalidasi dan tidak kosong:

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
    }
}

Aplikasi di sekitarnya harus menolak daftar kosong, memvalidasi URL, dan menggunakan impor normal net/http, net/url, dan sync. Daftar sebaiknya tetap tidak berubah selama pemilih ini memakainya, atau diganti melalui rancangan yang disinkronkan secara terpisah.

Lampirkan fungsi yang dikembalikan ke satu http.Transport yang dipertahankan. Mutex melindungi urutan pemilihan di antara callback yang bersamaan. Ini tidak mengharuskan menahan kunci saat permintaan jaringan yang lambat selesai.

Jangan memakai rute hanya untuk mencetaknya

Memanggil pemilih lagi untuk pesan diagnostik memajukan penghitung sekali lagi. Keluaran itu mungkin menjelaskan kandidat berikutnya alih-alih kandidat yang dipakai permintaan yang Anda selidiki. Catat pemilihan di dalam callback sebenarnya dengan pengenal titik akhir yang aman.

Pemanggilan callback bukan bukti bahwa permintaan berhasil dikirim. Pengalihan atau upaya transport tambahan dapat mempersulit asumsi sederhana “satu panggilan aplikasi, satu pilihan”. Jika alur kerja harus mempertahankan satu rute sepanjang beberapa operasi, pilih rute itu di batas alur kerja alih-alih memakai callback berputar global.

Round-robin juga tidak menjanjikan keluar publik yang berbeda. Ia menjadwalkan titik akhir. Identitas akhir tetap menjadi sifat dari jalur yang disediakan setiap titik akhir.

Artikel terkait