Ένας κοινόχρηστος κυκλικός επιλογέας proxy σε Go
Κρατήστε έναν επιλογέα proxy σε Go ζωντανό ανάμεσα στα αιτήματα, προστατέψτε την κοινόχρηστη κατάσταση επιλογής και διακρίνετε την επιλογή μιας διαδρομής από την παρατήρηση της εξόδου της.
Ένας επιλογέας μπορεί να εναλλάσσεται τέλεια και παρ’ όλα αυτά να επιλέγει πάντα το πρώτο proxy. Το λάθος είναι να δημιουργείται κατά λάθος νέος επιλογέας για κάθε αίτημα, γεγονός που μηδενίζει τον μετρητή του πριν προλάβει να κάνει δεύτερη επιλογή.
Κατασκευάστε τον επιλογέα μία φορά και κρατήστε τον μαζί με το transport. Η λίστα proxy HTTP μπορεί να παρέχει δημόσιους υποψηφίους HTTP για το σύνολο URL όταν τα αιτήματα επιτρέπουν δημόσιους μεσάζοντες. Ξεκινήστε με μια ήδη επικυρωμένη, μη κενή λίστα URL proxy:
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. Η λίστα θα πρέπει να παραμένει αμετάβλητη όσο αυτός ο επιλογέας τη χρησιμοποιεί, ή να αντικαθίσταται μέσω ξεχωριστά συγχρονισμένου σχεδιασμού.
Συνδέστε τη συνάρτηση που επιστρέφεται σε ένα retained http.Transport. Το mutex προστατεύει την ακολουθία επιλογής ανάμεσα σε ταυτόχρονες επιστροφές κλήσεων. Δεν απαιτεί να κρατείται κλείδωμα όσο ολοκληρώνεται ένα αργό αίτημα δικτύου.
Μην καταναλώνετε μια διαδρομή μόνο για να την εκτυπώσετε
Η εκ νέου κλήση του επιλογέα για διαγνωστικό μήνυμα προωθεί ξανά τον μετρητή. Αυτή η έξοδος μπορεί να περιγράφει τον επόμενο υποψήφιο αντί για τον υποψήφιο που χρησιμοποίησε το αίτημα που ερευνάτε. Καταγράψτε την επιλογή μέσα στην πραγματική επιστροφή κλήσης με ένα ασφαλές αναγνωριστικό τελικού σημείου.
Η κλήση μιας επιστροφής κλήσης δεν αποτελεί απόδειξη ότι ένα αίτημα παραδόθηκε με επιτυχία. Οι ανακατευθύνσεις ή οι πρόσθετες προσπάθειες transport μπορούν να περιπλέξουν την απλή υπόθεση «μία κλήση εφαρμογής, μία επιλογή». Αν μια ροή εργασίας πρέπει να κρατήσει μία διαδρομή σε πολλές λειτουργίες, επιλέξτε αυτή τη διαδρομή στο όριο της ροής εργασίας αντί να χρησιμοποιείτε μια καθολική κυκλική επιστροφή κλήσης.
Η κυκλική εναλλαγή επίσης δεν υπόσχεται διακριτές δημόσιες εξόδους. Χρονοπρογραμματίζει τελικά σημεία. Η τελική ταυτότητα παραμένει ιδιότητα της διαδρομής που παρέχει κάθε τελικό σημείο.