أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلىمستندات Apigee X. info
المشكلة
يتلقّى تطبيق العميل رمز حالة استجابة HTTP هو 503 مع الرسالة
Service Unavailable بعد طلب بيانات من خادم وكيل لواجهة برمجة التطبيقات.
رسالة الخطأ
يتلقّى تطبيق العميل رمز الاستجابة التالي:
HTTP/1.1 503 Service Unavailable
بالإضافة إلى ذلك، قد تظهر لك رسالة الخطأ التالية:
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}الأسباب المحتمَلة
| السبب | الوصف | تعليمات تحديد المشاكل وحلّها التي تنطبق على |
|---|---|---|
| يُنهي خادم الوجهة الاتصال قبل الأوان | يُنهي خادم الوجهة الاتصال قبل الأوان بينما لا تزال "معالجة الرسائل" تُرسِل حمولة الطلب. | مستخدمو السحابة الإلكترونية العامة والخاصة في Edge |
الخطوات الشائعة لتشخيص المشكلة
تحديد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه
أداة التتبُّع
لتحديد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:
- إذا كانت المشكلة لا تزال نشطة، فعِّل جلسة التتبُّع لواجهة برمجة التطبيقات المتأثرة.
- اطلب البيانات من واجهة برمجة التطبيقات وأعِد إنتاج المشكلة -
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لخادم وكيل معيّن لواجهة برمجة التطبيقات خلال مدة معيّنة (إذا حدثت المشكلة في الماضي) أو إذا كانت هناك أي طلبات لا تزال تتعذّر مع ظهور الخطأ503. - إذا كانت هناك أي أخطاء
503مع X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable، فدوِّن رقم تعريف الرسالة لطلب واحد أو أكثر من هذه الطلبات كما هو موضّح في المثال التالي:نموذج إدخال يعرض الخطأ
503
السبب: يُنهي خادم الوجهة الاتصال قبل الأوان
التشخيص
- إذا كنت مستخدمًا للسحابة الإلكترونية العامة أو السحابة الإلكترونية الخاصة :
- استخدِم "أداة التتبُّع" (كما هو موضّح في الخطوات الشائعة لتشخيص المشكلة)
وتأكَّد من ضبط كلٍّ من القيمتَين التاليتَين في لوحة بيانات "إحصاءات Google" المسجّلة:
- 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 لإجراء مزيد من التحقيق.
- استخدِم "أداة التتبُّع" (كما هو موضّح في الخطوات الشائعة لتشخيص المشكلة)
وتأكَّد من ضبط كلٍّ من القيمتَين التاليتَين في لوحة بيانات "إحصاءات Google" المسجّلة:
- إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة :
- حدِّد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه.
- ابحث عن رقم تعريف الرسالة في سجلّ "معالجة الرسائل"
(
/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
- يشير كلا الاستثناءَين إلى أنّ خادم الخلفية أغلق الاتصال قبل الأوان بينما كانت "معالجة الرسائل" لا تزال تكتب حمولة الطلب إلى خادم الخلفية. وبالتالي، تعرض "معالجة الرسائل" الاستثناء
java.io.IOException: Broken pipe. - يشير
Remote:IP:PORTإلى عنوان IP ورقم منفذ خادم الخلفية اللذين تم حلّهما. - تشير السمة
bytesWritten=76295في رسالة الخطأ أعلاه إلى أنّ "معالجة الرسائل" أرسلت حمولة بحجم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لبدء إغلاق الاتصال. - يوضّح ذلك بوضوح أنّ خادم الخلفية يُغلق الاتصال قبل الأوان بينما كانت "معالجة الرسائل" لا تزال تُرسِل حمولة الطلب.
- يؤدي ذلك إلى تسجيل "معالجة الرسائل" خطأ
IOException: Broken Pipeوعرض الرمز503على العميل.
- في الحزمة
الدقة
- تعاوَن مع فريق التطبيق و/أو فريق الشبكات لتحليل المشكلة وحلّها المتعلّقة بعمليات قطع الاتصال قبل الأوان على جانب خادم الخلفية.
- تأكَّد من أنّ تطبيق خادم الخلفية لا تنتهي مهلته أو تتم إعادة ضبط الاتصال قبل تلقّي حمولة الطلب بالكامل.
- إذا كان لديك أي جهاز أو طبقة شبكة وسيطة بين Apigee وخادم الخلفية، فتأكَّد من عدم انتهاء مهلتها قبل تلقّي حمولة الطلب بالكامل.
إذا استمرت المشكلة، انتقِل إلى يجب جمع معلومات التشخيص.
يجب جمع معلومات التشخيص
إذا استمرت المشكلة حتى بعد اتّباع التعليمات أعلاه، فاجمَع معلومات التشخيص التالية ثم تواصَل مع فريق دعم Apigee Edge:
إذا كنت مستخدمًا للسحابة الإلكترونية العامة، قدِّم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم خادم وكيل واجهة برمجة التطبيقات
- أمر
curlالكامل لإعادة إنتاج الخطأ503 - ملف التتبُّع الذي يحتوي على الطلب الذي يتضمّن الخطأ
503 Service Unavailable - إذا لم تكن أخطاء
503تحدث حاليًا، فحدِّد الفترة الزمنية مع معلومات المنطقة الزمنية التي حدثت فيها أخطاء503في الماضي.
إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة ، قدِّم المعلومات التالية:
- رسالة الخطأ الكاملة التي تظهر للطلبات التي تعذّر تنفيذها
- اسم المؤسسة واسم البيئة واسم خادم وكيل واجهة برمجة التطبيقات التي تظهر لك فيها أخطاء
503 - حزمة خادم وكيل واجهة برمجة التطبيقات
- ملف التتبُّع الذي يحتوي على الطلبات التي تتضمّن الخطأ
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التي تم جمعها على "معالجات الرسائل" وخادم الخلفية عند حدوث الخطأ