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

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

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

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

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

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

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

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

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

  • הפחתת מספר הבקשות שמגיעות לקצה העורפי
  • צמצום רוחב הפס ברשת
  • שיפור הביצועים וזמני התגובה של ה-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 שעות בגלל כשל פתאומי באתר, בעיות בהתאמת גודל, תחזוקה, שדרוג וכו'.

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

השפעה

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

שיטה מומלצת

  • לא לאחסן את תגובות השגיאה במטמון התגובות. כדי למנוע שמירת תגובות שגיאה במטמון, צריך לוודא שהרכיב <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 משרתי קצה עורפיים.