Bir seçici kusursuz sırayla dönebilir ve yine de ilk proxy’yi seçmeye devam edebilir. Hata, her istek için yanlışlıkla yeni bir seçici oluşturmaktır; bu, ikinci bir seçim yapmadan önce sayacını sıfırlar.

Seçiciyi bir kez oluşturun ve taşıma ile birlikte tutun. HTTP proxy listesi, istekler genel aracılara izin verdiğinde URL kümesi için genel HTTP adayları sağlayabilir. Önceden doğrulanmış, boş olmayan bir proxy URL listesiyle başlayın:

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

Çevreleyen uygulama boş listeyi reddetmeli, URL’leri doğrulamalı ve normal net/http, net/url ve sync içe aktarımlarını kullanmalıdır. Liste, bu seçici onu kullandığı sürece değişmez kalmalı veya ayrı olarak eşitlenmiş bir tasarımla değiştirilmelidir.

Döndürülen işlevi tek bir tutulan http.Transport öğesine bağlayın. Mutex, eşzamanlı geri çağırmalar arasında seçim sırasını korur. Yavaş bir ağ isteği tamamlanırken kilit tutulmasını gerektirmez.

Bir rotayı yalnızca yazdırmak için tüketmeyin

Tanılama iletisi için seçiciyi yeniden çağırmak sayacı yine ilerletir. Bu çıktı, incelediğiniz isteğin kullandığı aday yerine bir sonraki adayı tanımlayabilir. Seçimi gerçek geri çağırma içinde güvenli bir uç nokta tanımlayıcısıyla kaydedin.

Bir geri çağırma çağrısı, isteğin başarıyla iletildiğinin kanıtı değildir. Yönlendirmeler veya ek taşıma denemeleri “tek uygulama çağrısı, tek seçim” gibi basit bir varsayımı karmaşıklaştırabilir. Bir iş akışı birkaç işlem boyunca tek bir rotayı korumak zorundaysa, genel dönen bir geri çağırma kullanmak yerine o rotayı iş akışının sınırında seçin.

Sıralı dönüş aynı zamanda farklı genel çıkışlar da vaat etmez. Uç noktaları zamanlar. Son kimlik, her uç noktanın sağladığı yolun bir özelliği olarak kalır.

İlgili makaleler