شما در حال مشاهده اسناد 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:
- اگر مشکل همچنان فعال است، جلسه ردیابی را برای API آسیب دیده فعال کنید.
- تماس API را برقرار کنید و مشکل را تکرار کنید -
503 Service Unavailable
با کد خطاmessaging.adaptors.http.flow.ServiceUnavailable.
- یکی از درخواست های ناموفق را انتخاب کنید.
- به مرحله AX بروید و شناسه پیام (
X-Apigee.Message-ID
) درخواست را با اسکرول کردن در قسمت Phase Details همانطور که در شکل زیر نشان داده شده است تعیین کنید.
گزارش های دسترسی 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.ServiceUnailable وجود دارد، شناسه پیام یک یا چند درخواست از این قبیل را همانطور که در مثال زیر نشان داده شده است، یادداشت کنید:نمونه ورودی خطای
503
را نشان می دهد
علت: سرور هدف اتصال را زودتر از موعد قطع می کند
تشخیص
- اگر کاربر عمومی Cloud یا Private Cloud هستید:
- از ابزار Trace (همانطور که در مراحل تشخیص رایج توضیح داده شده است) استفاده کنید و بررسی کنید که هر دو مجموعه زیر را در صفحه Analytics Data Recorded دارید:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- از ابزار Trace استفاده کنید (همانطور که در مراحل تشخیص رایج توضیح داده شد) و بررسی کنید که هر دو مجموعه زیر را بلافاصله پس از ویژگی وضعیت
TARGET_REQ_FLOW
در پنجره Error دارید:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- برای بررسی بیشتر به استفاده از tcpdump بروید.
- از ابزار Trace (همانطور که در مراحل تشخیص رایج توضیح داده شده است) استفاده کنید و بررسی کنید که هر دو مجموعه زیر را در صفحه Analytics Data Recorded دارید:
- اگر کاربر 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
با دستورات زیر یک
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
tcpdump
گرفته شده را تجزیه و تحلیل کنید:نمونه خروجی tcpdump (جمع آوری شده در پردازشگر پیام):
در
tcpdump
بالا، می توانید موارد زیر را مشاهده کنید:- در بسته
4
، پردازشگر پیام یک درخواستPOST
را به سرور باطن ارسال کرد. - در بسته
5
،8
،9
،10
،11
، پردازشگر پیام به ارسال بار درخواست به سرور باطن ادامه داد. - در بسته
6
و7
، سرور باطن باACK
برای بخشی از بار درخواست دریافت شده از پردازشگر پیام پاسخ داد. - با این حال، در بسته
12
، به جای پاسخ دادن با یکACK
برای بسته های داده برنامه کاربردی و متعاقباً پاسخ دادن با بار پاسخ، سرور باطن در عوض با یکFIN ACK
پاسخ می دهد که بسته شدن اتصال را آغاز می کند. - این به وضوح نشان می دهد که سرور باطن در حال بستن زودهنگام اتصال است در حالی که پردازشگر پیام همچنان بار درخواست را ارسال می کند.
- این باعث می شود که پردازشگر پیام یک خطای
IOException: Broken Pipe
را ضبط کند و یک503
به مشتری بازگرداند.
- در بسته
قطعنامه
- برای تجزیه و تحلیل و رفع مشکل قطعهای زودهنگام در سمت سرور باطن، با هر دو یا هر دو برنامه و تیم شبکه خود کار کنید.
- قبل از دریافت کل بار بار درخواست، اطمینان حاصل کنید که برنامه سرور باطن در حال اتمام یا تنظیم مجدد اتصال نیست.
- اگر دستگاه یا لایه شبکهای واسطهای بین 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
در پردازشگرهای پیام و سرور باطن جمع آوری می شوند