אנטי-תבנית: השבתה של חיבורי 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. יש גם מאפיין ששולט בהתנהגות של שמירת החיבור פעיל לכל שירותי ה-Backend בכל ה-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).
  • שירותי קצה עורפיים צריכים להגיב עם כותרת Connection:close אם הם לא יכולים לטפל בחיבורים מתמשכים.

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

קריאה נוספת