يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات
Apigee X. المعلومات
المشكلة
يحصل تطبيق العميل على حالة استجابة 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 Access لتحديد رقم تعريف الرسالة لأخطاء 503
.
ويكون هذا الإجراء مفيدًا على وجه الخصوص إذا كانت المشكلة قد حدثت في الماضي أو كانت متقطّعة وتعذّر عليك تسجيل بيانات التتبّع في واجهة المستخدم. اتّبِع الخطوات التالية لتحديد هذه المعلومات من سجلات وصول NGINX:
- تحقَّق من سجلات وصول NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - يمكنك البحث لمعرفة ما إذا كانت هناك أي أخطاء
503
للخادم الوكيل المحدَّد لواجهة برمجة التطبيقات خلال مدة محدّدة (إذا حدثت المشكلة في السابق) أو إذا كانت هناك أي طلبات لا تزال يتعذّر تنفيذها مع503
. - في حال العثور على أي أخطاء
503
في X-Apigee-error-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: حدث ممر معطل أثناء الكتابة إلى قناة ClientExitChannel
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: {}
java.io.IOException: ممر معطل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
- يشير كلا الاستثناءات إلى أنّه بينما كان "معالج الرسائل" لا يزال يكتب حمولة الطلب إلى خادم الخلفية، تم إغلاق الاتصال بشكل سابق لأوانه من خلال الخادم الخلفية. وبالتالي، يطرح "معالج الرسائل" الاستثناء
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:
إذا كنت من مستخدمي Cloud Cloud، يُرجى تقديم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم الخادم الوكيل لواجهة برمجة التطبيقات
- أكمِل الأمر
curl
لإعادة إظهار الخطأ503
. - تتبُّع ملف التتبُّع الذي يحتوي على الطلب الذي يتضمّن الخطأ
503 Service Unavailable
- إذا لم تكن أخطاء
503
تحدث حاليًا، يمكنك توفير معلومات عن المنطقة الزمنية خلال الفترة الزمنية التي حدثت فيها أخطاء503
في الماضي.
إذا كنت مستخدم Cloud خاصًا، يُرجى تقديم المعلومات التالية:
- رسالة الخطأ الكاملة التي تم رصدها للطلبات التي تعذّر تنفيذها
- اسم المؤسسة واسم البيئة واسم الخادم الوكيل لواجهة برمجة التطبيقات التي تراقب أخطاء
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
على معالجات الرسائل وخادم الخلفية عند حدوث الخطأ.