503 الخدمة غير متوفرة - إغلاق مبكر من خادم الخلفية

أنت الآن بصدد الاطّلاع على مستندات 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

الخطوات الشائعة لتشخيص المشكلة

تحديد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه

أداة التتبُّع

لتحديد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:

  1. إذا كانت المشكلة لا تزال نشطة، فعِّل جلسة التتبُّع لواجهة برمجة التطبيقات المتأثرة.
  2. اطلب البيانات من واجهة برمجة التطبيقات وأعِد إنتاج المشكلة - 503 Service Unavailable مع رمز الخطأ messaging.adaptors.http.flow.ServiceUnavailable.
  3. اختَر أحد الطلبات التي تعذّر تنفيذها.
  4. انتقِل إلى مرحلة AX، وحدِّد رقم تعريف الرسالة (X-Apigee.Message-ID) للطلب من خلال الانتقال للأسفل في قسم تفاصيل المرحلة كما هو موضّح في الشكل التالي.

    معرّف الرسالة في قسم "تفاصيل المرحلة"

سجلات الوصول إلى NGINX

لتحديد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه باستخدام سجلات الوصول إلى NGINX، اتّبِع الخطوات التالية:

يمكنك أيضًا الرجوع إلى سجلات الوصول إلى NGINX لتحديد رقم تعريف الرسالة للأخطاء 503. ويكون ذلك مفيدًا بشكل خاص إذا حدثت المشكلة في الماضي أو إذا كانت متقطّعة ولم تتمكّن من تسجيل التتبُّع في واجهة المستخدم. اتّبِع الخطوات التالية لتحديد هذه المعلومات من سجلات الوصول إلى NGINX:

  1. اطّلِع على سجلات الوصول إلى NGINX: (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. ابحث لمعرفة ما إذا كانت هناك أي أخطاء 503 لخادم وكيل معيّن لواجهة برمجة التطبيقات خلال مدة معيّنة (إذا حدثت المشكلة في الماضي) أو إذا كانت هناك أي طلبات لا تزال تتعذّر مع ظهور الخطأ 503.
  3. إذا كانت هناك أي أخطاء 503 مع X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable، فدوِّن رقم تعريف الرسالة لطلب واحد أو أكثر من هذه الطلبات كما هو موضّح في المثال التالي:

    نموذج إدخال يعرض الخطأ 503

    نموذج إدخال يعرض رمز الحالة ومعرّف الرسالة ومصدر الخطأ ورمز الخطأ

السبب: يُنهي خادم الوجهة الاتصال قبل الأوان

التشخيص

  1. إذا كنت مستخدمًا للسحابة الإلكترونية العامة أو السحابة الإلكترونية الخاصة :
    1. استخدِم "أداة التتبُّع" (كما هو موضّح في الخطوات الشائعة لتشخيص المشكلة) وتأكَّد من ضبط كلٍّ من القيمتَين التاليتَين في لوحة بيانات "إحصاءات Google" المسجّلة:
      • 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: 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 pipe

      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

  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، واصلت "معالجة الرسائل" إرسال حمولة الطلب إلى خادم الخلفية.
    3. في الحزمتَين 6 و7، ردّ خادم الخلفية باستخدام ACK على جزء من حمولة الطلب التي تم تلقّيها من "معالجة الرسائل".
    4. مع ذلك، في الحزمة 12، بدلاً من الردّ باستخدام ACK على حِزم بيانات التطبيق التي تم تلقّيها والردّ لاحقًا باستخدام حمولة الاستجابة ، ردّ خادم الخلفية بدلاً من ذلك باستخدام FIN ACK لبدء إغلاق الاتصال.
    5. يوضّح ذلك بوضوح أنّ خادم الخلفية يُغلق الاتصال قبل الأوان بينما كانت "معالجة الرسائل" لا تزال تُرسِل حمولة الطلب.
    6. يؤدي ذلك إلى تسجيل "معالجة الرسائل" خطأ IOException: Broken Pipe وعرض الرمز 503 على العميل.

الدقة

  1. تعاوَن مع فريق التطبيق و/أو فريق الشبكات لتحليل المشكلة وحلّها المتعلّقة بعمليات قطع الاتصال قبل الأوان على جانب خادم الخلفية.
  2. تأكَّد من أنّ تطبيق خادم الخلفية لا تنتهي مهلته أو تتم إعادة ضبط الاتصال قبل تلقّي حمولة الطلب بالكامل.
  3. إذا كان لديك أي جهاز أو طبقة شبكة وسيطة بين 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 التي تم جمعها على "معالجات الرسائل" وخادم الخلفية عند حدوث الخطأ