คุณกำลังดูเอกสารประกอบ 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 สาธารณะและ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จ
เครื่องมือการติดตาม
วิธีระบุรหัสข้อความของคำขอที่ล้มเหลวโดยใช้เครื่องมือติดตาม
- ถ้าปัญหายังคงอยู่ ให้เปิดใช้ เซสชันการติดตามสำหรับ API ที่ได้รับผลกระทบ
- เรียกใช้ API และทำให้เกิดปัญหาซ้ำ -
503 Service Unavailable
มีรหัสข้อผิดพลาดmessaging.adaptors.http.flow.ServiceUnavailable.
- เลือกคำขอที่ไม่สำเร็จ 1 รายการ
- ไปที่ระยะ AX แล้วกำหนดรหัสข้อความ
(
X-Apigee.Message-ID
) ของคำขอโดยเลื่อนลงใน ส่วนรายละเอียดระยะดังที่แสดงในรูปต่อไปนี้
บันทึกการเข้าถึง NGINX
วิธีระบุรหัสข้อความของคำขอที่ล้มเหลวโดยใช้บันทึกการเข้าถึง NGINX
นอกจากนี้คุณยังดูบันทึกการเข้าถึง NGINX เพื่อดูรหัสข้อความสำหรับข้อผิดพลาด 503
ได้ด้วย
ซึ่งจะเป็นประโยชน์อย่างยิ่งหากเคยเกิดปัญหาในอดีตหรือเป็นปัญหาที่เกิดเป็นระยะๆ
และคุณจะไม่สามารถจับภาพการติดตามใน UI ได้ ใช้ขั้นตอนต่อไปนี้เพื่อดูข้อมูลนี้จากบันทึกการเข้าถึง NGINX
- ตรวจสอบบันทึกการเข้าถึง NGINX (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - ค้นหาว่ามีข้อผิดพลาด
503
สำหรับพร็อกซี API ที่ระบุในช่วงระยะเวลาหนึ่งหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอที่ยังคงดำเนินการไม่สำเร็จใน503
หรือไม่ - หากมี
503
ข้อผิดพลาดกับ X-Apigee-fault-codeการรับส่งข้อความ.adaptors.http.flow.ServiceUnavailable จดรหัสข้อความสําหรับคําขอดังกล่าวไว้อย่างน้อย 1 รายการ ดังที่แสดงในตัวอย่างต่อไปนี้รายการตัวอย่างที่แสดงข้อผิดพลาด
503
สาเหตุ: เซิร์ฟเวอร์เป้าหมายปิดการเชื่อมต่อก่อนกำหนด
การวินิจฉัย
- หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ หรือPrivate Cloud ให้ทำดังนี้
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวิเคราะห์ทั่วไป)
และยืนยันว่าคุณมีทั้ง 2 ชุดต่อไปนี้ในแผง Analytics Data Recorded
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวิเคราะห์ทั่วไป)
และยืนยันว่ามีการตั้งค่าทั้ง 2 รายการต่อไปนี้ในแผง Error ทันทีหลังจาก
พร็อพเพอร์ตี้ state
TARGET_REQ_FLOW
มีดังนี้- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- ไปที่การใช้ tcpdump เพื่อตรวจสอบเพิ่มเติม
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวิเคราะห์ทั่วไป)
และยืนยันว่าคุณมีทั้ง 2 ชุดต่อไปนี้ในแผง 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: ข้อยกเว้น 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
-
บันทึก
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 (รวบรวมจาก Message Processor)
ใน
tcpdump
ข้างต้น คุณจะเห็นสิ่งต่อไปนี้- ในแพ็กเก็ต
4
ผู้ประมวลผลข้อความได้ส่งคำขอPOST
ไปยัง เซิร์ฟเวอร์แบ็กเอนด์ - ในแพ็กเก็ต
5
,8
,9
,10
,11
ตัวประมวลผลข้อความยังคงส่งเพย์โหลดคำขอไปยัง เซิร์ฟเวอร์แบ็กเอนด์ - ในแพ็กเก็ต
6
และ7
เซิร์ฟเวอร์แบ็กเอนด์ตอบสนองด้วยACK
สำหรับส่วนหนึ่งของเพย์โหลดคำขอที่ได้รับจาก Message Processor - อย่างไรก็ตาม ในแพ็กเก็ต
12
แทนที่จะตอบกลับด้วยACK
สำหรับแพ็กเก็ตข้อมูลแอปพลิเคชันที่ได้รับและมีการตอบสนองด้วยการตอบสนองในภายหลัง เพย์โหลด เซิร์ฟเวอร์ส่วนหลังจะตอบสนองด้วยFIN ACK
ที่เริ่มต้น ปิดการเชื่อมต่อแล้ว - ข้อความนี้แสดงให้เห็นอย่างชัดเจนว่าเซิร์ฟเวอร์แบ็กเอนด์จะปิดการเชื่อมต่อก่อนเวลาอันควร ในขณะที่ตัวประมวลผลข้อความยังคงส่งเปย์โหลดคำขอ
- การดำเนินการนี้จะทำให้โปรแกรมประมวลผลข้อความบันทึก
IOException: Broken Pipe
แล้วส่งกลับ503
ไปยังไคลเอ็นต์
- ในแพ็กเก็ต
ความละเอียด
- ทำงานร่วมกับทีมแอปพลิเคชันและเครือข่ายทั้ง 2 ทีมหรือทั้ง 2 ทีมเพื่อวิเคราะห์และแก้ไขปัญหา ที่มีปัญหาการตัดการเชื่อมต่อก่อนกำหนดในฝั่งเซิร์ฟเวอร์ของแบ็กเอนด์
- ตรวจสอบว่าแอปพลิเคชันเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้หมดเวลาหรือรีเซ็ตการเชื่อมต่อ ก่อนรับเพย์โหลดคำขอทั้งหมด
- หากคุณมีอุปกรณ์หรือเลเยอร์เครือข่ายที่เป็นตัวกลางระหว่าง Apigee กับเซิร์ฟเวอร์แบ็กเอนด์ จากนั้นให้ตรวจสอบว่าไม่หมดเวลาก่อนที่จะได้รับเพย์โหลดคำขอทั้งหมด
หากยังคงพบปัญหาอยู่ ให้ไปที่หัวข้อต้องรวบรวมข้อมูลการวินิจฉัย
ต้องรวบรวมข้อมูลการวินิจฉัย
หากปัญหายังคงอยู่แม้ว่าจะทำตามคำแนะนำด้านบนแล้ว ให้รวบรวมข้อมูลต่อไปนี้ ข้อมูลการวินิจฉัย จากนั้นติดต่อฝ่ายสนับสนุนของ 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
ถูกรวบรวมไว้ในโปรแกรมประมวลผลข้อความและเซิร์ฟเวอร์แบ็กเอนด์เมื่อ เกิดข้อผิดพลาด