سرویس 503 در دسترس نیست - بسته شدن زودهنگام توسط سرور باطن

شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید .
اطلاعات

علامت

برنامه سرویس گیرنده یک وضعیت پاسخ HTTP 503 با پیغام Service Unavailable پس از تماس پراکسی API دریافت می کند.

پیغام خطا

برنامه مشتری کد پاسخ زیر را دریافت می کند:

HTTP/1.1 503 Service Unavailable

علاوه بر این، ممکن است پیغام خطای زیر را مشاهده کنید:

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}

علل احتمالی

علت توضیحات دستورالعمل های عیب یابی قابل اجرا برای
سرور هدف اتصال را زودتر از موعد قطع می کند در حالی که پردازشگر پیام همچنان در حال ارسال بار درخواستی است، سرور مورد نظر اتصال را پیش از موعد قطع می کند. کاربران Edge Public و Private Cloud

مراحل تشخیص رایج

شناسه پیام درخواست ناموفق را تعیین کنید

ابزار ردیابی

برای تعیین شناسه پیام درخواست ناموفق با استفاده از ابزار Trace:

  1. اگر مشکل همچنان فعال است، جلسه ردیابی را برای API آسیب دیده فعال کنید.
  2. تماس API را برقرار کنید و مشکل را تکرار کنید - 503 Service Unavailable با کد خطا messaging.adaptors.http.flow.ServiceUnavailable.
  3. یکی از درخواست های ناموفق را انتخاب کنید.
  4. به مرحله AX بروید و شناسه پیام ( X-Apigee.Message-ID ) درخواست را با اسکرول کردن در قسمت Phase Details همانطور که در شکل زیر نشان داده شده است تعیین کنید.

    Message ID in Phase Details section

گزارش های دسترسی NGINX

برای تعیین شناسه پیام درخواست ناموفق با استفاده از گزارش های دسترسی NGINX:

همچنین می توانید برای تعیین شناسه پیام خطاهای 503 به گزارش های دسترسی NGINX مراجعه کنید. این به ویژه در صورتی مفید است که مشکل در گذشته رخ داده باشد یا اگر مشکل متناوب باشد و شما نتوانید ردیابی را در رابط کاربری ثبت کنید. برای تعیین این اطلاعات از لاگ های دسترسی NGINX از مراحل زیر استفاده کنید:

  1. گزارش های دسترسی NGINX را بررسی کنید: ( /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log )
  2. جستجو کنید تا ببینید آیا خطاهای 503 برای پراکسی API خاص در طول یک مدت زمان مشخص وجود دارد (اگر مشکل در گذشته اتفاق افتاده باشد) یا اینکه آیا هنوز درخواست هایی وجود دارد که با 503 ناموفق هستند.
  3. اگر خطای 503 با X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnailable وجود دارد، شناسه پیام یک یا چند درخواست از این قبیل را همانطور که در مثال زیر نشان داده شده است، یادداشت کنید:

    نمونه ورودی خطای 503 را نشان می دهد

    Sample entry showing status code, message ID, fault source, and fault code

علت: سرور هدف اتصال را زودتر از موعد قطع می کند

تشخیص

  1. اگر کاربر عمومی Cloud یا Private Cloud هستید:
    1. از ابزار Trace (همانطور که در مراحل تشخیص رایج توضیح داده شده است) استفاده کنید و بررسی کنید که هر دو مجموعه زیر را در صفحه Analytics Data Recorded دارید:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. از ابزار Trace استفاده کنید (همانطور که در مراحل تشخیص رایج توضیح داده شد) و بررسی کنید که هر دو مجموعه زیر را بلافاصله پس از ویژگی وضعیت TARGET_REQ_FLOW در پنجره Error دارید:
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. برای بررسی بیشتر به استفاده از tcpdump بروید.
  2. اگر کاربر Private Cloud هستید:
    • شناسه پیام درخواست ناموفق را تعیین کنید .
    • شناسه پیام را در گزارش پردازشگر پیام جستجو کنید ( /opt/apigee/var/log/edge-message-processor/logs/system.log ).
    • یکی از استثناهای زیر را خواهید دید:

      استثنا شماره 1: java.io.IOException: لوله شکسته هنگام نوشتن در کانال 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: یک استثنا نوشتن: {}
      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 بایتی را به سرور backend ارسال کرده است.
    • ویژگی 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 تماس بگیرید:

اگر کاربر Public Cloud هستید، اطلاعات زیر را ارائه دهید:

  • نام سازمان
  • نام محیط زیست
  • نام پروکسی API
  • برای بازتولید خطای 503 دستور curl را کامل کنید
  • فایل ردیابی حاوی درخواست با خطای 503 Service Unavailable
  • اگر خطاهای 503 در حال حاضر رخ نمی دهند، دوره زمانی را با اطلاعات منطقه زمانی که خطاهای 503 در گذشته رخ داده است ارائه دهید.

اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:

  • پیام خطای کامل برای درخواست های ناموفق مشاهده شد
  • سازمان، نام محیط و نام پروکسی API که برای آنها خطاهای 503 مشاهده می کنید
  • بسته پروکسی API
  • فایل ردیابی حاوی درخواست ها با خطای 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 در پردازشگرهای پیام و سرور باطن جمع آوری می شوند