Bộ chọn proxy vòng tròn dùng chung trong Go
Giữ bộ chọn proxy Go sống giữa các yêu cầu, bảo vệ trạng thái chọn dùng chung và phân biệt việc chọn một tuyến với việc quan sát lối ra của nó.
Một bộ chọn có thể xoay vòng hoàn hảo mà vẫn luôn chọn proxy đầu tiên. Lỗi là vô tình tạo bộ chọn mới cho mỗi yêu cầu, điều này đặt lại bộ đếm trước khi nó có lựa chọn thứ hai.
Tạo bộ chọn một lần và giữ nó cùng với transport. Danh sách proxy HTTP có thể cung cấp các ứng viên HTTP công khai cho tập URL khi các yêu cầu cho phép trung gian công khai. Hãy bắt đầu với một danh sách URL proxy đã được xác thực và không rỗng:
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
}
}
Ứng dụng xung quanh phải từ chối danh sách rỗng, xác thực các URL và dùng các lệnh nhập thông thường net/http, net/url và sync. Danh sách nên giữ nguyên không đổi trong khi bộ chọn này dùng nó, hoặc được thay thế bằng một thiết kế đồng bộ riêng.
Gắn hàm được trả về vào một http.Transport được giữ lại. Mutex bảo vệ trình tự chọn giữa các callback đồng thời. Nó không đòi hỏi phải giữ khóa trong khi một yêu cầu mạng chậm hoàn tất.
Đừng tiêu thụ một tuyến chỉ để in nó ra
Gọi lại bộ chọn cho một thông điệp chẩn đoán sẽ lại đẩy bộ đếm về phía trước. Kết quả đó có thể mô tả ứng viên kế tiếp thay vì ứng viên mà yêu cầu bạn đang điều tra đã dùng. Ghi lại lựa chọn bên trong callback thực sự bằng một định danh điểm cuối an toàn.
Việc gọi một callback không phải là bằng chứng rằng một yêu cầu đã được gửi thành công. Chuyển hướng hoặc các lần thử transport bổ sung có thể làm phức tạp giả định đơn giản “một lần gọi ứng dụng, một lựa chọn”. Nếu một quy trình làm việc phải giữ một tuyến qua nhiều thao tác, hãy chọn tuyến đó ở ranh giới của quy trình thay vì dùng callback xoay vòng toàn cục.
Xoay vòng cũng không hứa hẹn các lối ra công khai khác nhau. Nó lên lịch các điểm cuối. Danh tính cuối cùng vẫn là thuộc tính của đường đi mà mỗi điểm cuối cung cấp.