אנטי-תבנית: השבתה של חיבורי HTTP קבועים (ניתנים לשימוש חוזר)

הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.

לעיון במסמכי התיעוד של Apigee Edge

proxy ל-API הוא ממשק לאפליקציות לקוח שמשמש לחיבור לשירותי קצה עורפי. ב-Apigee יש כמה דרכים להתחבר לשירותי קצה עורפי באמצעות proxy ל-API:

חיבורים קבועים

חיבור HTTP מתמשך, שנקרא גם HTTP keep-alive או שימוש חוזר בחיבור HTTP, הוא מושג שמאפשר לשלוח ולקבל כמה בקשות או תגובות HTTP בחיבור TCP יחיד, במקום לפתוח חיבור חדש לכל זוג של בקשה ותגובה.

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

אפשר להגדיר את משך הזמן הקצוב לתפוגה של הודעת keep-alive באמצעות מאפיין בשם keepalive.timeout.millis, שמצוין בהגדרות של TargetEndpoint של proxy ל-API. לדוגמה, אפשר להגדיר את משך הזמן של keep alive ל-30 שניות לשירות לקצה העורפי ספציפי ב-TargetEndpoint.

בדוגמה שלמטה, הערך של keepalive.timeout.millis מוגדר ל-30 שניות בהגדרות של TargetEndpoint:

<!-- /antipatterns/examples/disable-persistent-connections-1.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">30000</Property>
    </Properties>
  </HTTPTargetConnection>Disable HTTP persistent (Reusable keep-alive) connections
</TargetEndpoint>

בדוגמה שלמעלה, keepalive.timeout.millis שולט בהתנהגות של שמירת החיבור פעיל בשירות ספציפי לקצה העורפי ב-proxy ל-API. יש גם מאפיין ששולט בהתנהגות של שמירת החיבור פעיל בכל השירותים לקצה העורפי בכל שרתי ה-proxy. המאפיין HTTPTransport.keepalive.timeout.millis ניתן להגדרה ברכיב מעבד בקשות. ערך ברירת המחדל של המאפיין הזה הוא 60 שניות. כל שינוי במאפיין הזה משפיע על התנהגות החיבור של שמירת החיבור פעיל בין Apigee לבין כל השירותים לקצה העורפי בכל שרתי ה-proxy ל-API.

תבנית אנטי

לא מומלץ להשבית חיבורים מתמשכים (keep alive) על ידי הגדרת המאפיין keepalive.timeout.millis ל-0 בהגדרת TargetEndpoint של API Proxy ספציפי או הגדרת HTTPTransport.keepalive.timeout.millis ל-0 ב-Message Processors, כי זה ישפיע על הביצועים.

בדוגמה שלמטה, ההגדרה TargetEndpoint משביתה חיבורים קבועים (keep alive) לשירות לקצה העורפי ספציפי על ידי הגדרת keepalive.timeout.millis ל-0:

<!-- /antipatterns/examples/disable-persistent-connections-2.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">0</Property>
     </Properties>
  </HTTPTargetConnection>
</TargetEndpoint>

אם השבתתם את החיבורים הפתוחים לאורך זמן בשירותי קצה עורפיים אחד או יותר, מערכת Apigee צריכה לפתוח חיבור חדש לכל בקשה חדשה לשירותי הקצה העורפיים. אם ה-Backend הוא HTTPS,‏ Apigee יבצע גם לחיצת יד של SSL לכל בקשה חדשה, מה שיוסיף לזמן האחזור הכולל של בקשות ה-API.

השפעה

  • הגדלת זמן התגובה הכולל של בקשות ל-API, כי Apigee צריך לפתוח חיבור חדש ולבצע לחיצת יד של SSL לכל בקשה חדשה.
  • יכול להיות שייגמרו החיבורים בתנאים של תנועה גבוהה, כי לוקח זמן לשחרר חיבורים בחזרה למערכת.

שיטה מומלצת

  • שירותי הבק-אנד צריכים לכבד ולטפל בחיבור HTTP מתמשך בהתאם לתקנים של HTTP 1.1.
  • שירותי קצה עורפי צריכים להגיב עם כותרת Connection:keep-alive אם הם יכולים לטפל בחיבורים מתמשכים (keep alive).
  • שירותי backend צריכים להגיב עם כותרת Connection:close אם הם לא יכולים לטפל בחיבורים קבועים.

הטמעה של התבנית הזו תבטיח ש-Apigee יוכל לטפל באופן אוטומטי בחיבור מתמשך או לא מתמשך לשירותים לקצה העורפי, בלי שיהיה צורך לבצע שינויים ב-proxy ל-API.

קריאה נוספת