אנטי-תבנית: שמירת תגובות שגיאה במטמון

אתם צופים במסמכי התיעוד של Apigee ושל Apigee Hybrid.
לעיון במסמכי התיעוד של Apigee Edge.

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

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

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

‫Apigee מאפשר לאחסן נתונים במטמון בזמן הריצה כדי לשמור אותם ולאחזר אותם מהר יותר. תכונת השמירה במטמון זמינה דרך המדיניות PopulateCache,‏ המדיניות LookupCache,‏ המדיניות InvalidateCache והמדיניות ResponseCache.

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

המדיניות בנושא מטמון תגובות:

  • מפחית את מספר הבקשות שמגיעות לקצה העורפי
  • מצמצם את רוחב הפס של הרשת
  • שיפור הביצועים של ה-API וזמני התגובה

תבנית אנטי

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

זוהי דוגמה למדיניות של מטמון תגובות עם הגדרות ברירת מחדל:

<!-- /antipatterns/examples/1-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
  <DisplayName>TargetServer ResponseCache</DisplayName>
  <CacheKey>
    <Key Fragment ref="request.uri" /></CacheKey>
    <Scope>Exclusive</Scope>
    <ExpirySettings>
      <TimeoutInSec ref="flow.variable.here">600</TimeoutInSec>
    </ExpirySettings>
  <CacheResource>targetCache</CacheResource>
</ResponseCache>

מדיניות Response Cache (מטמון תגובות) שומרת במטמון תגובות שגיאה בהגדרת ברירת המחדל שלה. עם זאת, לא מומלץ לשמור במטמון תגובות שגיאה בלי לחשוב היטב על ההשלכות השליליות, כי:

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

    או

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

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

תרחיש 1: כשל זמני בשרת העורפי או במשאב

יכול להיות שהכשל בשרת העורפי נובע מאחת מהסיבות הבאות:

  • תקלה זמנית ברשת
  • השרת העורפי עמוס מאוד ולא יכול להגיב לבקשות לתקופה זמנית
  • יכול להיות שהמשאב המבוקש בשרת העורפי הוסר או שהוא לא זמין לתקופה מסוימת
  • השרת בקצה העורפי מגיב לאט בגלל זמן עיבוד ארוך מדי לתקופה זמנית, וכו'

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

תרחיש 2: כשל ממושך או קבוע בבק-אנד או במשאב

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

  • משאב ספציפי בעורף המערכת לא יהיה זמין למשך שעה

    או

  • השרת העורפי הוסר או לא זמין למשך 24 שעות בגלל כשל פתאומי באתר, בעיות בהתאמת קנה מידה, תחזוקה, שדרוג וכו'.

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

השפעה

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

שיטה מומלצת

  • לא לאחסן את תגובות השגיאה במטמון התגובות. כדי למנוע שמירת תגובות שגיאה במטמון, צריך לוודא שהרכיב <ExcludeErrorResponse> מוגדר ל-true במדיניות ResponseCache, כמו בקטע הקוד הבא. עם ההגדרה הזו, רק התגובות לקודי ההצלחה שמוגדרים כברירת מחדל (200 עד 205, אלא אם קודי ההצלחה שונו) יישמרו במטמון.
    <!-- /antipatterns/examples/1-2.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
      <DisplayName>TargetServerResponseCache</DisplayName>
      <CacheKey>
        <KeyFragment ref="request.uri" />
      </CacheKey>
      <Scope>Exclusive</Scope>
      <ExpirySettings>
        <TimeoutinSec ref="flow.variable.here">600</TimeoutinSec>
      </ExpirySettings>
      <CacheResource>targetCache</CacheResource>
      <ExcludeErrorResponse>true</ExcludeErrorResponse>
    </ResponseCache>
  • אם יש לך דרישה לשמור במטמון את תגובות השגיאה מסיבה ספציפית, תוכל לקבוע את משך הזמן המקסימלי או המדויק שבו השגיאה תופיע (אם אפשר):
    • צריך להגדיר את זמן התפוגה בצורה מתאימה כדי לוודא שלא מתבצע קירור של תגובות השגיאה למשך זמן ארוך יותר מהזמן שבו הכשל יכול להופיע.
    • משתמשים במדיניות ResponseCache כדי לשמור במטמון את תגובות השגיאה ללא הרכיב <ExcludeErrorResponse>.

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

  • ‫Apigee לא ממליצה לשמור במטמון תגובות 5xx משרתי קצה עורפי.