یک انتخابگر پروکسی گردشی مشترک در Go
یک انتخابگر پروکسی Go را میان درخواستها زنده نگه دارید، وضعیت انتخاب مشترک را محافظت کنید و انتخاب یک مسیر را از مشاهده خروجی آن جدا کنید.
یک انتخابگر میتواند کاملاً بچرخد و همچنان همان پروکسی اول را انتخاب کند. خطا در آن است که بهطور تصادفی برای هر درخواست انتخابگر تازهای ساخته شود، که شمارندهاش را پیش از آنکه انتخاب دومی داشته باشد بازنشانی میکند.
انتخابگر را یک بار بسازید و آن را همراه با ترابری نگه دارید. فهرست پروکسی HTTP میتواند وقتی درخواستها واسطههای عمومی را مجاز میدانند، کاندیدهای عمومی HTTP را برای مجموعه نشانیها فراهم کند. با فهرستی از نشانیهای پروکسی که پیشتر اعتبارسنجی شده و خالی نیست آغاز کنید:
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
}
}
برنامه پیرامون باید فهرست خالی را رد کند، نشانیها را اعتبارسنجی کند و از واردکردنهای معمول net/http، net/url و sync استفاده کند. فهرست باید تا زمانی که این انتخابگر از آن استفاده میکند تغییرناپذیر بماند، یا از راه طرحی که جداگانه همگام شده جایگزین شود.
تابع بازگشتی را به یک http.Transport نگهداشتهشده متصل کنید. قفل متقابل ترتیب انتخاب را در میان فراخوانیهای بازگشتی همزمان محافظت میکند. نیازی ندارد که هنگام کامل شدن یک درخواست شبکهٔ کند قفلی نگه داشته شود.
مسیری را تنها برای چاپ آن مصرف نکنید
فراخوانی دوبارهٔ انتخابگر برای پیامی تشخیصی شمارنده را باز هم جلو میبرد. آن خروجی ممکن است کاندید بعدی را توصیف کند، نه کاندیدی را که درخواست در حال بررسی استفاده کرده است. انتخاب را درون فراخوانی بازگشتی واقعی با شناسهٔ امن نقطهٔ پایانی ثبت کنید.
فراخوانی یک callback اثبات آن نیست که درخواستی با موفقیت تحویل داده شده است. تغییرمسیرها یا تلاشهای ترابری افزوده میتوانند فرض سادهٔ «یک فراخوانی برنامه، یک انتخاب» را پیچیده کنند. اگر گردش کاری باید یک مسیر را در چند عملیات نگه دارد، بهجای استفاده از یک callback گردان جهانی آن مسیر را در مرز گردش کار انتخاب کنید.
گردش نوبتی نیز خروجیهای عمومی متمایز را وعده نمیدهد. این نقاط پایانی را زمانبندی میکند. هویت نهایی همچنان ویژگی مسیری است که هر نقطهٔ پایانی فراهم میکند.