מוצג המסמך של 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 בענן הציבורי והפרטי |
שלבי אבחון נפוצים
קביעת מזהה ההודעה של הבקשה שנכשלה
כלי המעקב
כדי לזהות את מזהה ההודעה של הבקשה שנכשלה באמצעות כלי המעקב:
- אם הבעיה עדיין פעילה, יש להפעיל את סשן מעקב של ה-API המושפע.
- מבצעים את הקריאה ל-API ומשחזרים את הבעיה –
503 Service Unavailable
עם קוד השגיאהmessaging.adaptors.http.flow.ServiceUnavailable.
- בוחרים אחת מהבקשות שנכשלו.
- עוברים אל שלב AX ומזהים את מזהה ההודעה.
(
X-Apigee.Message-ID
) של הבקשה על ידי גלילה למטה בקטע הקטע פרטי שלב כמו באיור הבא.
יומני גישה ל-NGINX
כדי לקבוע את מזהה ההודעה של הבקשה שנכשלה באמצעות יומני הגישה NGINX:
אפשר גם לעיין ביומני NGINX Access כדי לבדוק את מזהה ההודעה של השגיאות 503
.
האפשרות הזו שימושית במיוחד אם הבעיה התרחשה בעבר או אם היא מתרחשת לסירוגין
ואין לך אפשרות לתעד את המעקב בממשק המשתמש. כדי לראות את המידע הזה ביומני הגישה של NGINX, צריך לפעול לפי השלבים הבאים:
- כדאי לבדוק את יומני הגישה ל-NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - אפשר לחפש אם יש שגיאות
503
בשרת ה-proxy הספציפי ל-API במהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות לגבי503
. - אם יש שגיאות
503
ב-X-Apigee-fault-code messages.adaptors.http.flow.ServiceUnavailable, שימו לב למזהה ההודעה של בקשה אחת או יותר, כמו בדוגמה הבאה:רשומה לדוגמה שמציגה את השגיאה
503
הסיבה: שרת היעד סוגר את החיבור מוקדם מדי
אבחון
- אם אתם משתמשים ב-Public Cloud או ב-Private Cloud:
- משתמשים בכלי המעקב (כפי שמוסבר בשלבי האבחון הנפוצים)
ומאמתים שבחלונית Analytics Data Recorded יש את שתי הקבוצות הבאות:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- משתמשים בכלי המעקב (כפי שמוסבר בשלבי האבחון הנפוצים)
ומוודאים ששתי ההגדרות הבאות מופיעות בחלונית שגיאה מיד אחרי
מאפיין המצב
TARGET_REQ_FLOW
:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- למידע נוסף, אפשר לעבור אל שימוש ב-tcpdump.
- משתמשים בכלי המעקב (כפי שמוסבר בשלבי האבחון הנפוצים)
ומאמתים שבחלונית Analytics Data Recorded יש את שתי הקבוצות הבאות:
- אם אתם משתמשים בענן פרטי:
- בודקים את מזהה ההודעה של הבקשה שנכשלה.
- חיפוש מזהה ההודעה ביומן מעבד ההודעות
(
/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
-
מתעדים
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
, מעבד ההודעות המשיך לשלוח את המטען הייעודי (payload) של הבקשה שרת עורפי. - בחבילה
6
ו-7
,שרת הקצה העורפי הגיב עםACK
עבור חלק מהמטען הייעודי (Payload) של הבקשה שהתקבל ממעבד ההודעות. - עם זאת, בחבילה
12
, במקום להשיב באמצעותACK
עבור חבילות הנתונים של האפליקציה שהתקבלו ולאחר מכן מגיבה המטען הייעודי (payload), שרת הקצה העורפי מגיב במקום זאת באמצעותFIN ACK
שמתחיל את התהליך סגירת החיבור. - הדבר מראה בבירור ששרת הקצה העורפי סוגר את החיבור מוקדם מדי בזמן שמעבד ההודעות עדיין שלח את המטען הייעודי (payload) של הבקשה.
- הפעולה הזו תגרום למעבד ההודעות להקליט
IOException: Broken Pipe
שגיאה ולהחזיר את הערך503
ללקוח
- בחבילה
רזולוציה
- לעבוד עם צוותי האפליקציות והרשתות שלכם או עם שניהם כדי לנתח ולתקן את בגלל הניתוקים המוקדמים בצד השרת העורפי.
- מוודאים שהתזמון של שרת הקצה העורפי לא מסתיים או מאפס את החיבור לפני קבלת המטען הייעודי (payload) המלא של הבקשה.
- אם יש לכם שכבה או מכשיר מתווכים של רשתות בין 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
שנאספו במעבדי ההודעות ובשרת הקצה העורפי כאשר אירעה שגיאה