מאגר פרוקסים יכול להכיל נקודות קצה בעלות יכולות שונות מאוד. מתן רשות לחמישים פעולות בכל היישום אינו מונע מארבעים ותשע מהן לבחור באותו פרוקסי.

אם המדיניות היא „לכל היותר ארבע פעולות בתהליך דרך כל פרוקסי נבחר”, הביעו את המדיניות הזו ישירות. החזיקו סמפור לכל זהות פרוקסי, ורכשו אותו סביב העבודה שצורכת את הקיבולת של הפרוקסי.

limits = {proxy: asyncio.Semaphore(4) for proxy in proxy_urls}

async def fetch(session, proxy, url):
    async with limits[proxy]:
        async with session.get(url, proxy=proxy) as response:
            return await response.read()

סקיצה זו מניחה ש־asyncio כבר יובא ושה־URL-ים של הפרוקסים אומתו. לבקשות ציבוריות בנתיב פרוקסי ציבורי מותר, רשימת פרוקסי ה־HTTP מספקת מועמדים ל־URL-ים של פרוקסי ב־aiohttp. יישום אמיתי צריך גם להגדיר פסק זמן משלו לבקשה ולהחליט כמה נתוני תגובה הוא צריך. קריאת קובץ גדול כולו לזיכרון היא החלטת משאבים נפרדת.

שמרו את ההיתר לחלק היקר

שחרור הסמפור ברגע שכותרות התגובה מגיעות עלול לסכל את המגבלה המיועדת. גוף בזרימה עשוי להמשיך להשתמש בחיבור הרבה אחר כך. שמרו את ההיתר עד שהגוף נצרך או שהתגובה נסגרה בהתאם לזרימת העבודה של היישום.

מנהלי ההקשר המקוננים הופכים את הניקוי לגלוי כאשר חריגה או ביטול עוזבים את הפעולה. הימנעו מרכישה ידנית ומשחרור רק בתחתית פונקציה מוצלחת.

מגבלות חיבורים עונות על שאלה אחרת

מגבלות המחבר של aiohttp מגבילות חיבורים לפי הכללים המתועדים של המחבר. הן נשארות שימושיות לצד סמפור של היישום. מגבלת חיבורים לכל יעד אינה מבטאת, רק לפי שמה, תקציב משותף לכל היעדים שהוקצו לפרוקסי אחד.

הבחינו גם בין מקביליות לקצב בקשות. ארבע בקשות ארוכות טווח וארבע בקשות קצרות מאוד משתמשות באותה הקצאת מקביליות בעודן מפיקות קצבי בקשות לשנייה שונים. שירות עם מדיניות קצב עשוי להזדקק לתזמון או למגביל קצב נפרד.

בחרו מזהה פרוקסי יציב ולא סודי ללוגים ולמדדים. אם שני URL-ים הנושאים אישורים מתייחסים לאותו מאגר קיבולת, החליטו אם עליהם לחלוק תקציב אחד. לעומת זאת, פורטים או חשבונות שונים יכולים לייצג מגבלות נפרדות כאשר המפעיל מתעד אותם כך.

כאשר התפוקה יורדת, בדקו היכן העבודה ממתינה: בסמפור שלכם, במחבר, בהקמת החיבור לפרוקסי או בקריאת התגובות. העלאת כל המגבלות בבת אחת מקשה על ההבחנה הזו ועלולה להעביר את התור לפרוקסי שאינכם שולטים בו.

מאמרים קשורים