ตัวเลือกสามารถหมุนเวียนได้อย่างสมบูรณ์แบบและยังคงเลือกพร็อกซีตัวแรกอยู่ดี ข้อผิดพลาดคือการสร้างตัวเลือกใหม่โดยไม่ตั้งใจสำหรับทุกคำขอ ซึ่งจะรีเซ็ตตัวนับก่อนที่มันจะมีทางเลือกที่สอง

สร้างตัวเลือกเพียงครั้งเดียวและเก็บไว้กับทรานสปอร์ต รายการพร็อกซี 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 แบบหมุนเวียนทั่วโลก

การหมุนเวียนแบบวนรอบยังไม่รับประกันทางออกสาธารณะที่แตกต่างกัน มันจัดตารางปลายทาง ตัวตนสุดท้ายยังคงเป็นคุณสมบัติของเส้นทางที่แต่ละปลายทางจัดหาให้

บทความที่เกี่ยวข้อง