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

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

علامت

برنامه‌ی کلاینت پس از فراخوانی پروکسی API، وضعیت پاسخ 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

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

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

ابزار ردیابی

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

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

    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.ServiceUnavailable وجود دارد، شناسه پیام را برای یک یا چند درخواست از این دست، همانطور که در مثال زیر نشان داده شده است، یادداشت کنید:

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

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

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

تشخیص

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

      متن جایگزین

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

      متن جایگزین

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

      استثنای شماره ۱: 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)

      یا

      استثنای شماره ۲: استثنای 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
    • هر دوی این استثنائات نشان می‌دهند که در حالی که پردازنده پیام هنوز در حال نوشتن بار داده درخواست به سرور backend بوده، اتصال توسط سرور backend به طور زودرس بسته شده است. از این رو، پردازنده پیام استثنای java.io.IOException: Broken pipe را صادر می‌کند.
    • عبارت Remote: IP : PORT نشان دهنده آدرس IP سرور backend و شماره پورت مربوطه است.
    • ویژگی bytesWritten=76295 در پیام خطای فوق نشان می‌دهد که پردازنده پیام، هنگام بسته شدن زودهنگام اتصال، یک payload به حجم 76295 بایت به سرور backend ارسال کرده است.
    • ویژگی bytesRead=0 نشان می‌دهد که پردازشگر پیام هیچ داده‌ای (پاسخی) از سرور backend دریافت نکرده است.
    • برای بررسی بیشتر این مشکل، یک tcpdump یا روی سرور backend یا پردازنده پیام جمع‌آوری کنید و آن را مطابق توضیحات زیر تجزیه و تحلیل کنید.

استفاده از tcpdump

  1. با استفاده از دستورات زیر، یک tcpdump روی سرور backend یا پردازنده پیام ضبط کنید:

    دستور برای جمع‌آوری tcpdump در سرور backend:

    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 (جمع‌آوری شده در پردازشگر پیام):

    متن جایگزین

    در tcpdump بالا، می‌توانید موارد زیر را مشاهده کنید:

    1. در بسته 4 ، پردازشگر پیام یک درخواست POST به سرور backend ارسال کرد.
    2. در بسته‌های 5 ، 8 ، 9 ، 10 ، 11 ، پردازشگر پیام به ارسال بار داده درخواست به سرور بک‌اند ادامه داد.
    3. در بسته‌های 6 و 7 ، سرور backend با ACK به بخشی از درخواست دریافت شده از پردازنده پیام پاسخ داد.
    4. با این حال، در بسته 12 ، به جای پاسخ دادن با یک ACK برای بسته‌های داده برنامه دریافتی و متعاقباً پاسخ دادن با بار داده پاسخ، سرور backend با یک FIN ACK پاسخ می‌دهد و شروع به بستن اتصال می‌کند.
    5. این به وضوح نشان می‌دهد که سرور backend در حالی که پردازنده پیام هنوز در حال ارسال بار داده درخواست بود، اتصال را زودتر از موعد مقرر قطع می‌کند.
    6. این باعث می‌شود که پردازشگر پیام، خطای IOException: Broken Pipe ثبت کند و کد 503 به کلاینت برگرداند.

وضوح تصویر

  1. با یکی از تیم‌های برنامه و شبکه یا هر دوی آنها همکاری کنید تا مشکل قطع شدن زودهنگام اتصال در سمت سرور بک‌اند را تجزیه و تحلیل و برطرف کنید.
  2. مطمئن شوید که برنامه‌ی سرور backend قبل از دریافت کل بار داده‌ی درخواست، زمان‌بندی اتصال را به پایان نمی‌رساند یا آن را ریست نمی‌کند.
  3. اگر بین Apigee و سرور backend دستگاه یا لایه شبکه واسطه‌ای دارید، مطمئن شوید که زمان‌بندی آنها قبل از دریافت کل بار درخواست به پایان نرسیده باشد.

اگر مشکل همچنان ادامه داشت، به «باید اطلاعات تشخیصی جمع‌آوری شود» بروید.

باید اطلاعات تشخیصی جمع‌آوری کند

اگر مشکل حتی پس از دنبال کردن دستورالعمل‌های بالا ادامه داشت، اطلاعات تشخیصی زیر را جمع‌آوری کرده و سپس با پشتیبانی Apigee Edge تماس بگیرید:

اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:

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