ตัวเลือกพร็อกซีแบบวนรอบที่ใช้ร่วมกันใน 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 ที่เก็บไว้หนึ่งตัว Mutex ปกป้องลำดับการเลือกระหว่างการเรียกกลับที่เกิดขึ้นพร้อมกัน ไม่จำเป็นต้องถือล็อกในขณะที่คำขอเครือข่ายที่ช้ากำลังเสร็จสิ้น
อย่าใช้เส้นทางเพียงเพื่อพิมพ์มันออกมา
การเรียกตัวเลือกอีกครั้งเพื่อข้อความวินิจฉัยจะเลื่อนตัวนับไปข้างหน้าอีกครั้ง ผลลัพธ์นั้นอาจอธิบายผู้สมัครรายถัดไปแทนผู้สมัครที่คำขอซึ่งคุณกำลังตรวจสอบใช้ บันทึกการเลือกไว้ภายในคอลแบ็กจริงด้วยตัวระบุปลายทางที่ปลอดภัย
การเรียก callback ไม่ใช่หลักฐานว่าคำขอถูกส่งไปถึงสำเร็จ การเปลี่ยนเส้นทางหรือความพยายามขนส่งเพิ่มเติมอาจทำให้สมมติฐานง่ายๆ ว่า “เรียกแอปพลิเคชันหนึ่งครั้ง เลือกหนึ่งครั้ง” ซับซ้อนขึ้น หากเวิร์กโฟลว์ต้องคงเส้นทางเดียวตลอดหลายการดำเนินการ ให้เลือกเส้นทางนั้นที่ขอบเขตของเวิร์กโฟลว์แทนการใช้ callback แบบหมุนเวียนทั่วโลก
การหมุนเวียนแบบวนรอบยังไม่รับประกันทางออกสาธารณะที่แตกต่างกัน มันจัดตารางปลายทาง ตัวตนสุดท้ายยังคงเป็นคุณสมบัติของเส้นทางที่แต่ละปลายทางจัดหาให้