503 שירות לא זמין - סגירה מוקדמת על ידי שרת קצה עורפי

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

תיאור הבעיה

אפליקציית הלקוח מקבלת סטטוס תגובת HTTP‏ 503 עם ההודעה Service Unavailable אחרי קריאה ל-proxy ל-API.

הודעת שגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 503 Service Unavailable

בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}

סיבות אפשריות

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
שרת היעד סוגר את החיבור לפני הזמן שרת היעד מסיים את החיבור לפני הזמן, בזמן שמעבד ההודעות עדיין שולח את מטען הבקשה. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud

שלבים נפוצים לאבחון

קביעת מזהה ההודעה של הבקשה שנכשלה

כלי המעקב

כדי לקבוע את מזהה ההודעה של הבקשה שנכשלה באמצעות הכלי 'מעקב':

  1. אם הבעיה עדיין פעילה, מפעילים את trace session עבור ה-API המושפע.
  2. מבצעים את הקריאה ל-API ומשחזרים את הבעיה – 503 Service Unavailable עם קוד השגיאה messaging.adaptors.http.flow.ServiceUnavailable.
  3. בוחרים אחת מהבקשות שנכשלו.
  4. עוברים אל שלב AX וגוללים למטה בקטע פרטי השלב כדי למצוא את מזהה ההודעה (X-Apigee.Message-ID) של הבקשה, כמו שמוצג באיור הבא.

    מזהה ההודעה בקטע 'פרטי השלב'

יומני גישה של NGINX

כדי לקבוע את מזהה ההודעה של הבקשה שנכשלה באמצעות יומני הגישה של NGINX:

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

  1. בודקים את יומני הגישה של NGINX:‏ (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. מחפשים 503 שגיאות עבור ה-proxy ל-API הספציפי במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 503.
  3. אם יש 503 שגיאות עם X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable, שימו לב למזהה ההודעה של בקשה אחת או יותר כאלה, כמו שמוצג בדוגמה הבאה:

    ערך לדוגמה עם שגיאת 503

    דוגמה לרשומה שבה מוצגים קוד סטטוס, מזהה הודעה, מקור השגיאה וקוד השגיאה

הסיבה: שרת היעד סוגר את החיבור לפני הזמן

אבחון

  1. אם אתם משתמשים ב-Public Cloud או ב-Private Cloud:
    1. משתמשים בכלי Trace (כפי שמוסבר בשלבים נפוצים לניתוח) כדי לוודא ששני הערכים הבאים מוגדרים בחלונית Analytics Data Recorded:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. משתמשים בכלי המעקב (כפי שמוסבר בשלבים נפוצים לאבחון) ובודקים ששתי ההגדרות הבאות מוגדרות בחלונית Error מיד אחרי מאפיין TARGET_REQ_FLOW state:
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. כדי לבצע בדיקה מעמיקה יותר, צריך לעבור אל שימוש ב-tcpdump.
  2. אם אתם משתמשים ב-Private Cloud:
    • קביעת מזהה ההודעה של הבקשה שנכשלה.
    • מחפשים את מזהה ההודעה ביומן של מעבד הבקשות (/opt/apigee/var/log/edge-message-processor/logs/system.log).
    • יוצג אחד מהחריגים הבאים:

      חריג מספר 1: java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel

      2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy
      rev:1 messageid:myorg-opdk-test-1-30312-13747-1  NIOThread@1
      INFO  HTTP.SERVICE - ExceptionHandler.handleException() :
      Exception java.io.IOException: Broken pipe occurred while writing to channel
      ClientOutputChannel(ClientChannel[Connected:
      Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1
      bytesRead=0 bytesWritten=76295 age=2012ms  lastIO=2ms  isOpen=false)

      או

      חריג מס' 2: onExceptionWrite exception: {}
      java.io.IOException: Broken pipe

      2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test
      rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1
      NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() :
      ClientChannel[Connected: Remote:IP:PORT
      Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms  lastIO=2
      ms  isOpen=false.onExceptionWrite exception: {}
      java.io.IOException: Broken pipe
    • שתי החריגות האלה מצביעות על כך שבעוד מעבד הבקשות עדיין כתב את מטען ייעודי (payload) לשרת בק-אנד, החיבור נסגר מוקדם מדי על ידי שרת בק-אנד. לכן, מעבד ההודעות יוצר את החריגה java.io.IOException: Broken pipe.
    • הערך Remote:IP:PORT מציין את כתובת ה-IP ומספר היציאה של שרת הקצה העורפי אחרי הפתרון.
    • המאפיין bytesWritten=76295 בהודעת השגיאה שלמעלה מציין שמעבד ההודעות שלח מטען ייעודי (payload) בגודל 76295 בייט לשרת העורפי כשהחיבור נסגר לפני הזמן.
    • המאפיין bytesRead=0 מציין שמעבד ההודעות לא קיבל נתונים (תגובה) מהשרת העורפי.
    • כדי לבדוק את הבעיה הזו לעומק, צריך לאסוף tcpdump בשרת העורפי או במעבד ההודעות ולנתח אותו כמו שמוסבר בהמשך.

שימוש ב-tcpdump

  1. מבצעים צילום מסך של tcpdump בשרת העורפי או במעבד ההודעות באמצעות הפקודות הבאות:

    פקודה לאיסוף tcpdump בשרת העורפי:

    tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
    

    פקודה לאיסוף tcpdump במעבד ההודעות:

    tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
    
  2. ניתוח הנתונים שtcpdump נאספו:

    פלט לדוגמה של tcpdump (שנאסף במעבד ההודעות):

    alt_text

    בדוגמה שלמעלה tcpdump, אפשר לראות את הפרטים הבאים:

    1. בחבילה 4, מעבד ההודעות שלח בקשת POST לשרת הקצה העורפי.
    2. במנות 5,‏ 8,‏ 9,‏ 10 ו-11, מעבד ההודעות המשיך לשלוח את מטען הבקשה לשרת העורפי.
    3. במנות 6 ו-7,שרת הקצה העורפי הגיב עם ACK לחלק ממטען הבקשה שהתקבל ממעבד ההודעות.
    4. עם זאת, בחבילה 12, במקום להגיב עם ACK לחבילות הנתונים של האפליקציה שהתקבלו ואז להגיב עם מטען התגובה, שרת הקצה העורפי מגיב עם FIN ACK שמתחיל את סגירת החיבור.
    5. אפשר לראות בבירור ששרת בק-אנד סוגר את החיבור לפני הזמן בזמן שמעבד בקשות עדיין שולח את מטען ייעודי (payload) של הבקשה.
    6. כתוצאה מכך, מעבד ההודעות מתעד שגיאה ומחזיר 503 ללקוח. IOException: Broken Pipe

רזולוציה

  1. כדאי לעבוד עם צוות האפליקציה או עם צוות הרשת (או עם שניהם) כדי לנתח ולפתור את הבעיה של הניתוקים המוקדמים בצד השרת של העורף.
  2. מוודאים שאפליקציית השרת בעורף לא מפסיקה את הפעולה בגלל חוסר פעילות או מאפסת את החיבור לפני קבלת כל מטען הבקשה.
  3. אם יש לכם מכשיר או שכבת רשת מתווכים בין Apigee לבין שרת הקצה העורפי, צריך לוודא שהם לא מפסיקים את הפעולה לפני שמתקבל מטען הייעודי (payload) של הבקשה.

אם הבעיה נמשכת, עוברים אל איסוף מידע לצורך אבחון.

צריך לאסוף פרטי אבחון

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

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

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

אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:

  • הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
  • שם הארגון, שם הסביבה ושם ה-API Proxy שבהם נצפו שגיאות 503
  • חבילת proxy ל-API
  • קובץ מעקב שמכיל את הבקשות עם השגיאה 503 Service Unavailable
  • יומני גישה של NGINX
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  • יומנים של מעבד בקשות
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • תקופת הזמן עם פרטי אזור הזמן שבה אירעו השגיאות 503
  • Tcpdumps שנאספו במעבדי ההודעות ובשרת הקצה העורפי כשהשגיאה התרחשה