คุณกำลังดูเอกสารประกอบของ 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 |
ขั้นตอนการวินิจฉัยทั่วไป
กำหนดรหัสข้อความของคำขอที่ล้มเหลว
เครื่องมือการติดตาม
วิธีระบุรหัสข้อความของคำขอที่ล้มเหลวโดยใช้เครื่องมือติดตาม
- หากยังพบปัญหาอยู่ ให้เปิดใช้ เซสชันการติดตามสำหรับ 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 messages.adaptors.http.flow.ServiceUnavailable โปรดจดรหัสข้อความสำหรับคำขออย่างน้อย 1 รายการดังที่แสดงในตัวอย่างต่อไปนี้รายการตัวอย่างที่แสดงข้อผิดพลาด
503
สาเหตุ: เซิร์ฟเวอร์เป้าหมายปิดการเชื่อมต่อก่อนกำหนด
การวินิจฉัย
- หากคุณเป็นผู้ใช้ Public Cloud หรือ Private Cloud ให้ทำดังนี้
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป) และตรวจสอบว่าคุณตั้งค่าทั้ง 2 อย่างต่อไปนี้ในแผงบันทึกข้อมูล Analytics
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป) และตรวจสอบว่าคุณตั้งค่าทั้ง 2 อย่างต่อไปนี้ในแผงข้อผิดพลาดทันทีหลังจากพร็อพเพอร์ตี้
TARGET_REQ_FLOW
สถานะ- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- โปรดไปที่การใช้ tcpdump เพื่อตรวจสอบเพิ่มเติม
- ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป) และตรวจสอบว่าคุณตั้งค่าทั้ง 2 อย่างต่อไปนี้ในแผงบันทึกข้อมูล Analytics
- หากคุณเป็นผู้ใช้ Private Cloud ให้ทำดังนี้
- กำหนดรหัสข้อความของคำขอที่ล้มเหลว
- ค้นหารหัสข้อความในบันทึกของตัวประมวลผลข้อความ (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) - คุณจะเห็นข้อยกเว้นข้อใดข้อหนึ่งต่อไปนี้
ข้อยกเว้น #1: java.io.IOException: พบท่อเสียหายขณะเขียนไปยังช่องทาง ClientExportChannel
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
- ข้อยกเว้นทั้ง 2 รายการนี้ระบุว่าในขณะที่ผู้ประมวลผลข้อความยังคงเขียนเปย์โหลดคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์อยู่ การเชื่อมต่อถูกปิดก่อนกำหนดโดยเซิร์ฟเวอร์แบ็กเอนด์ ดังนั้น โปรแกรมประมวลผลข้อความจึงแสดงข้อผิดพลาด
java.io.IOException: Broken pipe
Remote:IP:PORT
จะระบุที่อยู่ IP และหมายเลขพอร์ตของเซิร์ฟเวอร์แบ็กเอนด์ที่แก้ไขแล้ว- แอตทริบิวต์
bytesWritten=76295
ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งบอกว่าผู้ประมวลผลข้อความได้ส่งเพย์โหลด76295
ไบต์ไปยังเซิร์ฟเวอร์แบ็กเอนด์เมื่อปิดการเชื่อมต่อก่อนกำหนด - แอตทริบิวต์
bytesRead=0
บ่งบอกว่าผู้ประมวลผลข้อความยังไม่ได้รับข้อมูลใดๆ (การตอบสนอง) จากเซิร์ฟเวอร์แบ็กเอนด์ - หากต้องการตรวจสอบปัญหานี้เพิ่มเติม ให้รวบรวม
tcpdump
ในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor แล้ววิเคราะห์ตามที่อธิบายด้านล่าง
การใช้ 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
หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี 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
รวบรวมในตัวประมวลผลข้อความและเซิร์ฟเวอร์แบ็กเอนด์เมื่อเกิดข้อผิดพลาด