503 ไม่มีบริการ - ปิดก่อนกำหนดโดยเซิร์ฟเวอร์ส่วนหลัง

คุณกำลังดูเอกสารประกอบ 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

ขั้นตอนการวินิจฉัยทั่วไป

กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จ

เครื่องมือการติดตาม

วิธีระบุรหัสข้อความของคำขอที่ล้มเหลวโดยใช้เครื่องมือติดตาม

  1. ถ้าปัญหายังคงอยู่ ให้เปิดใช้ เซสชันการติดตามสำหรับ API ที่ได้รับผลกระทบ
  2. เรียกใช้ API และทำให้เกิดปัญหาซ้ำ - 503 Service Unavailable มีรหัสข้อผิดพลาด messaging.adaptors.http.flow.ServiceUnavailable.
  3. เลือกคำขอที่ไม่สำเร็จ 1 รายการ
  4. ไปที่ระยะ AX แล้วกำหนดรหัสข้อความ (X-Apigee.Message-ID) ของคำขอโดยเลื่อนลงใน ส่วนรายละเอียดระยะดังที่แสดงในรูปต่อไปนี้

    รหัสข้อความในส่วนรายละเอียดเฟส

บันทึกการเข้าถึง NGINX

วิธีระบุรหัสข้อความของคำขอที่ล้มเหลวโดยใช้บันทึกการเข้าถึง NGINX

นอกจากนี้คุณยังดูบันทึกการเข้าถึง NGINX เพื่อดูรหัสข้อความสำหรับข้อผิดพลาด 503 ได้ด้วย ซึ่งจะเป็นประโยชน์อย่างยิ่งหากเคยเกิดปัญหาในอดีตหรือเป็นปัญหาที่เกิดเป็นระยะๆ และคุณจะไม่สามารถจับภาพการติดตามใน UI ได้ ใช้ขั้นตอนต่อไปนี้เพื่อดูข้อมูลนี้จากบันทึกการเข้าถึง NGINX

  1. ตรวจสอบบันทึกการเข้าถึง NGINX (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. ค้นหาว่ามีข้อผิดพลาด 503 สำหรับพร็อกซี API ที่ระบุในช่วงระยะเวลาหนึ่งหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอที่ยังคงดำเนินการไม่สำเร็จใน 503 หรือไม่
  3. หากมี 503 ข้อผิดพลาดกับ X-Apigee-fault-codeการรับส่งข้อความ.adaptors.http.flow.ServiceUnavailable จดรหัสข้อความสําหรับคําขอดังกล่าวไว้อย่างน้อย 1 รายการ ดังที่แสดงในตัวอย่างต่อไปนี้

    รายการตัวอย่างที่แสดงข้อผิดพลาด 503

    รายการตัวอย่างที่แสดงรหัสสถานะ รหัสข้อความ แหล่งที่มาของข้อผิดพลาด และรหัสข้อผิดพลาด

สาเหตุ: เซิร์ฟเวอร์เป้าหมายปิดการเชื่อมต่อก่อนกำหนด

การวินิจฉัย

  1. หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ หรือPrivate Cloud ให้ทำดังนี้
    1. ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวิเคราะห์ทั่วไป) และยืนยันว่าคุณมีทั้ง 2 ชุดต่อไปนี้ในแผง Analytics Data Recorded
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ในขั้นตอนการวิเคราะห์ทั่วไป) และยืนยันว่ามีการตั้งค่าทั้ง 2 รายการต่อไปนี้ในแผง Error ทันทีหลังจาก พร็อพเพอร์ตี้ state TARGET_REQ_FLOW มีดังนี้
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. ไปที่การใช้ tcpdump เพื่อตรวจสอบเพิ่มเติม
  2. หากคุณเป็นผู้ใช้ 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

  1. บันทึก 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
    
  2. วิเคราะห์ tcpdump ที่บันทึก:

    ตัวอย่างเอาต์พุต tcpdump (รวบรวมจาก Message Processor)

    alt_text

    ใน tcpdump ข้างต้น คุณจะเห็นสิ่งต่อไปนี้

    1. ในแพ็กเก็ต 4 ผู้ประมวลผลข้อความได้ส่งคำขอ POST ไปยัง เซิร์ฟเวอร์แบ็กเอนด์
    2. ในแพ็กเก็ต 5, 8, 9, 10, 11 ตัวประมวลผลข้อความยังคงส่งเพย์โหลดคำขอไปยัง เซิร์ฟเวอร์แบ็กเอนด์
    3. ในแพ็กเก็ต 6 และ 7 เซิร์ฟเวอร์แบ็กเอนด์ตอบสนองด้วย ACK สำหรับส่วนหนึ่งของเพย์โหลดคำขอที่ได้รับจาก Message Processor
    4. อย่างไรก็ตาม ในแพ็กเก็ต 12 แทนที่จะตอบกลับด้วย ACK สำหรับแพ็กเก็ตข้อมูลแอปพลิเคชันที่ได้รับและมีการตอบสนองด้วยการตอบสนองในภายหลัง เพย์โหลด เซิร์ฟเวอร์ส่วนหลังจะตอบสนองด้วย FIN ACK ที่เริ่มต้น ปิดการเชื่อมต่อแล้ว
    5. ข้อความนี้แสดงให้เห็นอย่างชัดเจนว่าเซิร์ฟเวอร์แบ็กเอนด์จะปิดการเชื่อมต่อก่อนเวลาอันควร ในขณะที่ตัวประมวลผลข้อความยังคงส่งเปย์โหลดคำขอ
    6. การดำเนินการนี้จะทำให้โปรแกรมประมวลผลข้อความบันทึก IOException: Broken Pipe แล้วส่งกลับ 503 ไปยังไคลเอ็นต์

ความละเอียด

  1. ทำงานร่วมกับทีมแอปพลิเคชันและเครือข่ายทั้ง 2 ทีมหรือทั้ง 2 ทีมเพื่อวิเคราะห์และแก้ไขปัญหา ที่มีปัญหาการตัดการเชื่อมต่อก่อนกำหนดในฝั่งเซิร์ฟเวอร์ของแบ็กเอนด์
  2. ตรวจสอบว่าแอปพลิเคชันเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้หมดเวลาหรือรีเซ็ตการเชื่อมต่อ ก่อนรับเพย์โหลดคำขอทั้งหมด
  3. หากคุณมีอุปกรณ์หรือเลเยอร์เครือข่ายที่เป็นตัวกลางระหว่าง 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 ถูกรวบรวมไว้ในโปรแกรมประมวลผลข้อความและเซิร์ฟเวอร์แบ็กเอนด์เมื่อ เกิดข้อผิดพลาด