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

يتم الآن عرض مستندات 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 العام والخاص على السحابة الإلكترونية

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

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

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

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

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

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

سجلات وصول NGINX

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

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

  1. تحقَّق من سجلات وصول NGINX: (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. يمكنك البحث لمعرفة ما إذا كانت هناك أي أخطاء 503 للخادم الوكيل المحدَّد لواجهة برمجة التطبيقات خلال مدة محدّدة (إذا حدثت المشكلة في السابق) أو إذا كانت هناك أي طلبات لا تزال يتعذّر تنفيذها مع 503.
  3. في حال العثور على أي أخطاء 503 في X-Apigee-error-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: حدث ممر معطل أثناء الكتابة إلى قناة 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

  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:

إذا كنت من مستخدمي 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 على معالجات الرسائل وخادم الخلفية عند حدوث الخطأ.