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

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

תיאור הבעיה

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

הודעת שגיאה

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

HTTP/1.1 503 Service Unavailable

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

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

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

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

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

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

כלי המעקב

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

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

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

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

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

אפשר גם לעיין ביומני NGINX Access כדי לבדוק את מזהה ההודעה של השגיאות 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 messages.adaptors.http.flow.ServiceUnavailable, שימו לב למזהה ההודעה של בקשה אחת או יותר, כמו בדוגמה הבאה:

    רשומה לדוגמה שמציגה את השגיאה 503

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

הסיבה: שרת היעד סוגר את החיבור מוקדם מדי

אבחון

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

      alt_text

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

      alt_text

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

      חריג מס' 1: JavaScript.io.IO וגם חריג: אירעה תקלה בצינור עיבוד נתונים במהלך הכתיבה לערוץ 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: onErrorWrite export: {}
      Java.io.IOError: צינור עיבוד נתונים מנותק

      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, מעבד ההודעות המשיך לשלוח את המטען הייעודי (payload) של הבקשה שרת עורפי.
    3. בחבילה 6 ו-7,שרת הקצה העורפי הגיב עם ACK עבור חלק מהמטען הייעודי (Payload) של הבקשה שהתקבל ממעבד ההודעות.
    4. עם זאת, בחבילה 12, במקום להשיב באמצעות ACK עבור חבילות הנתונים של האפליקציה שהתקבלו ולאחר מכן מגיבה המטען הייעודי (payload), שרת הקצה העורפי מגיב במקום זאת באמצעות FIN ACK שמתחיל את התהליך סגירת החיבור.
    5. הדבר מראה בבירור ששרת הקצה העורפי סוגר את החיבור מוקדם מדי בזמן שמעבד ההודעות עדיין שלח את המטען הייעודי (payload) של הבקשה.
    6. הפעולה הזו תגרום למעבד ההודעות להקליט IOException: Broken Pipe שגיאה ולהחזיר את הערך 503 ללקוח

רזולוציה

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

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

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

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

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

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

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

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