คุณกำลังดูเอกสารประกอบ 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ถูกรวบรวมไว้ในโปรแกรมประมวลผลข้อความและเซิร์ฟเวอร์แบ็กเอนด์เมื่อ เกิดข้อผิดพลาด