شما در حال مشاهده مستندات 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:
- اگر مشکل هنوز پابرجاست، جلسه ردیابی را برای API آسیبدیده فعال کنید.
- فراخوانی API را انجام دهید و مشکل را دوباره ایجاد کنید -
503 Service Unavailableبا کد خطایmessaging.adaptors.http.flow.ServiceUnavailable. - یکی از درخواستهای ناموفق را انتخاب کنید.
- به مرحله AX بروید و شناسه پیام (
X-Apigee.Message-ID) درخواست را با پیمایش به پایین در بخش جزئیات مرحله ، همانطور که در شکل زیر نشان داده شده است، تعیین کنید.
گزارشهای دسترسی NGINX
برای تعیین شناسه پیام درخواست ناموفق با استفاده از گزارشهای دسترسی NGINX:
همچنین میتوانید برای تعیین شناسه پیام خطاهای 503 به گزارشهای دسترسی NGINX مراجعه کنید. این امر به ویژه در صورتی مفید است که مشکل در گذشته رخ داده باشد یا اگر مشکل به صورت متناوب رخ میدهد و شما قادر به ثبت رد آن در رابط کاربری نیستید. برای تعیین این اطلاعات از گزارشهای دسترسی NGINX، از مراحل زیر استفاده کنید:
- گزارشهای دسترسی NGINX را بررسی کنید: (
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log) - جستجو کنید تا ببینید آیا در یک دوره زمانی خاص (اگر مشکل در گذشته رخ داده است) خطای
503برای پروکسی API خاص وجود دارد یا خیر، یا اینکه آیا درخواستهایی وجود دارد که هنوز با خطای503با شکست مواجه میشوند. - اگر هرگونه خطای
503با X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable وجود دارد، شناسه پیام را برای یک یا چند درخواست از این دست، همانطور که در مثال زیر نشان داده شده است، یادداشت کنید:نمونه ورودی که خطای
503را نشان میدهد
علت: سرور هدف اتصال را قبل از موعد مقرر قطع میکند
تشخیص
- اگر شما یک کاربر ابر عمومی یا ابر خصوصی هستید:
- از ابزار Trace (همانطور که در مراحل تشخیص مشترک توضیح داده شده است) استفاده کنید و تأیید کنید که هر دو مورد زیر را در پنل Analytics Data Recorded دارید:
- کد خطا X-Apigee:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

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

- کلاس خطا:
- برای بررسی بیشتر به بخش استفاده از tcpdump مراجعه کنید.
- از ابزار Trace (همانطور که در مراحل تشخیص مشترک توضیح داده شده است) استفاده کنید و تأیید کنید که هر دو مورد زیر را در پنل Analytics Data Recorded دارید:
- اگر شما یک کاربر فضای ابری خصوصی هستید:
- شناسه پیام درخواست ناموفق را تعیین کنید .
- شناسه پیام را در گزارش پردازشگر پیام (
/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
با استفاده از دستورات زیر، یک
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
tcpdumpضبط شده را تجزیه و تحلیل کنید:نمونه خروجی tcpdump (جمعآوری شده در پردازشگر پیام):

در
tcpdumpبالا، میتوانید موارد زیر را مشاهده کنید:- در بسته
4، پردازشگر پیام یک درخواستPOSTبه سرور backend ارسال کرد. - در بستههای
5،8،9،10،11، پردازشگر پیام به ارسال بار داده درخواست به سرور بکاند ادامه داد. - در بستههای
6و7، سرور backend باACKبه بخشی از درخواست دریافت شده از پردازنده پیام پاسخ داد. - با این حال، در بسته
12، به جای پاسخ دادن با یکACKبرای بستههای داده برنامه دریافتی و متعاقباً پاسخ دادن با بار داده پاسخ، سرور backend با یکFIN ACKپاسخ میدهد و شروع به بستن اتصال میکند. - این به وضوح نشان میدهد که سرور backend در حالی که پردازنده پیام هنوز در حال ارسال بار داده درخواست بود، اتصال را زودتر از موعد مقرر قطع میکند.
- این باعث میشود که پردازشگر پیام، خطای
IOException: Broken Pipeثبت کند و کد503به کلاینت برگرداند.
- در بسته
وضوح تصویر
- با یکی از تیمهای برنامه و شبکه یا هر دوی آنها همکاری کنید تا مشکل قطع شدن زودهنگام اتصال در سمت سرور بکاند را تجزیه و تحلیل و برطرف کنید.
- مطمئن شوید که برنامهی سرور backend قبل از دریافت کل بار دادهی درخواست، زمانبندی اتصال را به پایان نمیرساند یا آن را ریست نمیکند.
- اگر بین 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 جمعآوری شدند.