Antipattern: השבתת חיבורי HTTP קבועים (לשימוש חוזר)

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

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

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

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

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

אפשר להגדיר את תקופת הזמן הקצוב לתפוגה של פריט שנשאר פעיל באמצעות נכס בשם keepalive.timeout.millis, שצוין בתצורה של TargetEndpoint של שרת proxy ל-API. לדוגמה, אפשר להגדיר את פרק הזמן של שמירה כ-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 Edge לכל השירותים לקצה העורפי בכל שרתי ה-proxy של ה-API.

דוגמת עיצוב

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

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

<!-- /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>

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

השפעה

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

שיטה מומלצת

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

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

קריאה נוספת