אתם צופים במסמכי התיעוד של 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 |
שלבים נפוצים לאבחון
קביעת מזהה ההודעה של הבקשה שנכשלה
כלי המעקב
כדי לקבוע את מזהה ההודעה של הבקשה שנכשלה באמצעות הכלי 'מעקב':
- אם הבעיה עדיין פעילה, מפעילים את trace session עבור ה-API המושפע.
- מבצעים את הקריאה ל-API ומשחזרים את הבעיה –
503 Service Unavailableעם קוד השגיאהmessaging.adaptors.http.flow.ServiceUnavailable. - בוחרים אחת מהבקשות שנכשלו.
- עוברים אל שלב AX וגוללים למטה בקטע פרטי השלב כדי למצוא את מזהה ההודעה (
X-Apigee.Message-ID) של הבקשה, כמו שמוצג באיור הבא.
יומני גישה של NGINX
כדי לקבוע את מזהה ההודעה של הבקשה שנכשלה באמצעות יומני הגישה של NGINX:
אפשר גם לעיין ביומני הגישה של NGINX כדי לזהות את מזהה ההודעה של השגיאות 503.
האפשרות הזו שימושית במיוחד אם הבעיה התרחשה בעבר או אם הבעיה מתרחשת לסירוגין ואין אפשרות לצלם את הנתונים בממשק המשתמש. כדי לקבוע את המידע הזה מיומני הגישה של NGINX:
- בודקים את יומני הגישה של NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log) - מחפשים
503שגיאות עבור ה-proxy ל-API הספציפי במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם503. - אם יש
503שגיאות עם X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable, שימו לב למזהה ההודעה של בקשה אחת או יותר כאלה, כמו שמוצג בדוגמה הבאה:ערך לדוגמה עם שגיאת
503
הסיבה: שרת היעד סוגר את החיבור לפני הזמן
אבחון
- אם אתם משתמשים ב-Public Cloud או ב-Private Cloud:
- משתמשים בכלי Trace (כפי שמוסבר בשלבים נפוצים לניתוח) כדי לוודא ששני הערכים הבאים מוגדרים בחלונית Analytics Data Recorded:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- משתמשים בכלי המעקב (כפי שמוסבר בשלבים נפוצים לאבחון)
ובודקים ששתי ההגדרות הבאות מוגדרות בחלונית Error מיד אחרי
מאפיין
TARGET_REQ_FLOWstate:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException - error.cause:
Broken pipe

- error.class:
- כדי לבצע בדיקה מעמיקה יותר, צריך לעבור אל שימוש ב-tcpdump.
- משתמשים בכלי Trace (כפי שמוסבר בשלבים נפוצים לניתוח) כדי לוודא ששני הערכים הבאים מוגדרים בחלונית Analytics Data Recorded:
- אם אתם משתמשים ב-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 pipe2021-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
-
מבצעים צילום מסך של
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
- ניתוח הנתונים ש
tcpdumpנאספו:פלט לדוגמה של tcpdump (שנאסף במעבד ההודעות):

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