คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ
Apigee X info
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP 504 พร้อมข้อความ
Gateway Timeout เป็นการตอบกลับการเรียก API
รหัสสถานะ HTTP - 504 Gateway Timeout error แสดงว่าไคลเอ็นต์
ไม่ได้รับการตอบกลับจาก Edge Gateway หรือเซิร์ฟเวอร์แบ็กเอนด์อย่างทันท่วงทีในระหว่างการดำเนินการ
API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 504 Gateway Timeout
ในบางกรณี คุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้ด้วย
{
"fault": {
"faultstring": "Gateway Timeout",
"detail": {
"errorcode": "messaging.adaptors.http.flow.GatewayTimeout"
}
}
}อะไรเป็นสาเหตุของข้อผิดพลาด Gateway Timeout
เส้นทางทั่วไปสำหรับคำขอ API ผ่านแพลตฟอร์ม Edge คือ Client -> Router -> Message Processor -> Backend Server ดังที่แสดงในรูปด้านล่าง

แอปพลิเคชันไคลเอ็นต์ เราเตอร์ และตัวประมวลผลข้อความภายในแพลตฟอร์ม Edge จะได้รับการตั้งค่าด้วยค่าระยะหมดเวลาที่เหมาะสม
แพลตฟอร์ม Edge คาดหวังว่าจะได้รับคำตอบภายในระยะเวลาหนึ่ง
สำหรับคำขอ API ทุกรายการตามค่าการหมดเวลา หากคุณไม่ได้รับการตอบกลับภายในระยะเวลาที่กำหนด ระบบจะแสดงผล 504 Gateway Timeout Error
ตารางต่อไปนี้แสดงรายละเอียดเพิ่มเติมเกี่ยวกับเวลาที่อาจเกิดการหมดเวลาใน Edge
| การหมดเวลา | รายละเอียด |
|---|---|
| เกิดการหมดเวลาใน Message Processor |
|
| เราเตอร์หมดเวลา |
|
| แอปพลิเคชันไคลเอ็นต์หมดเวลา |
|
สาเหตุที่เป็นไปได้
ใน Edge สาเหตุทั่วไปของข้อผิดพลาด 504 Gateway Timeout ได้แก่
| สาเหตุ | รายละเอียด | ขั้นตอนที่ระบุสำหรับ |
|---|---|---|
| เซิร์ฟเวอร์แบ็กเอนด์ช้า | เซิร์ฟเวอร์แบ็กเอนด์ที่ประมวลผลคำขอ API ทำงานช้าเกินไปเนื่องจากมีการใช้งานสูงหรือ ประสิทธิภาพไม่ดี | ผู้ใช้ระบบคลาวด์สาธารณะและส่วนตัว |
| การประมวลผลคำขอ API ของ Edge ช้า | Edge ใช้เวลานานในการประมวลผลคำขอ API เนื่องจากโหลดสูงหรือประสิทธิภาพต่ำ |
เซิร์ฟเวอร์แบ็กเอนด์ช้า
หากเซิร์ฟเวอร์แบ็กเอนด์ทำงานช้ามากหรือใช้เวลานานในการประมวลผลคำขอ API คุณจะได้รับข้อผิดพลาด 504 Gateway Timeout ดังที่อธิบายไว้ในส่วนด้านบน การหมดเวลาอาจเกิดขึ้นในสถานการณ์ใดสถานการณ์หนึ่งต่อไปนี้
- Message Processor หมดเวลาทำงานก่อนที่เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับ
- เราเตอร์หมดเวลาตอบสนองก่อนที่ Message Processor/เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง
- แอปพลิเคชันไคลเอ็นต์หมดเวลาทำงานก่อนที่ Router/Message Processor/เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับ
ส่วนต่อไปนี้จะอธิบายวิธีวินิจฉัยและแก้ไขปัญหาในแต่ละสถานการณ์
สถานการณ์ #1 Message Processor หมดเวลาตอบสนองก่อนที่เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับ
การวินิจฉัย
คุณสามารถใช้ขั้นตอนต่อไปนี้เพื่อวินิจฉัยว่า504 Gateway Timeoutเกิดข้อผิดพลาด
เนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ทำงานช้าหรือไม่
ขั้นตอนที่ 1 การใช้ Trace
หากปัญหายังคงเกิดขึ้น (ยังคงมีข้อผิดพลาด 504) ให้ทำตามขั้นตอนด้านล่าง
- ติดตาม API ที่ได้รับผลกระทบใน Edge UI รอให้เกิดข้อผิดพลาด หรือหากมีการเรียก API ให้เรียก API บางรายการและจำลองข้อผิดพลาด
504 Gateway Timeout - เมื่อเกิดข้อผิดพลาดแล้ว ให้ตรวจสอบคำขอที่เฉพาะเจาะจงซึ่งแสดงโค้ดตอบกลับเป็น
504 - ตรวจสอบเวลาที่ผ่านไปในแต่ละเฟสและจดบันทึกเฟสที่ใช้เวลานานที่สุด
- หากคุณพบข้อผิดพลาดที่มีเวลาที่ผ่านไปนานที่สุดทันทีหลังจากระยะใดระยะหนึ่งต่อไปนี้ แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์ทำงานช้าหรือใช้เวลานานในการประมวลผลคำขอ
- ส่งคำขอไปยังเซิร์ฟเวอร์เป้าหมายแล้ว
- นโยบาย ServiceCallout
ต่อไปนี้คือตัวอย่างการติดตามที่แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบสนองแม้หลังจากผ่านไป 55 วินาที ส่งผลให้เกิดข้อผิดพลาด 504 Gateway Timeout

ในการติดตามด้านบน Message Processor จะหมดเวลาหลังจาก 55002 มิลลิวินาทีเนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบสนอง
ขั้นตอนที่ 2: ใช้บันทึกของ Message Processor
- ตรวจสอบบันทึกของ Message Processor
(
/opt/apigee/var/log/edge-message-processor/logs/system.log) -
หากพบข้อผิดพลาด
Gateway TimeoutและonTimeoutReadสำหรับคำขอพร็อกซี API ที่เฉพาะเจาะจง ในเวลาที่เฉพาะเจาะจง แสดงว่า Message Processor หมดเวลาตัวอย่างบันทึกของ Message Processor ที่แสดงข้อผิดพลาด Gateway Timeout
2015-09-29 20:16:54,340 org:myorg env:staging api:profiles rev:13 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4d898cf1, Gateway Timeout) 2015-09-29 20:16:57,361 org:myorg env:staging api:profileNewsletters rev:8 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$3.onTimeout() : SSLClientChannel[C:XX.XX.XX.XX:443 Remote host:192.168.38.54:38302]@120171 useCount=2 bytesRead=0 bytesWritten=824 age=55458ms lastIO=55000ms .onTimeoutRead
ในบันทึกของ Message Processor ด้านบน คุณจะเห็นว่าเซิร์ฟเวอร์แบ็กเอนด์ที่มีที่อยู่ IP XX.XX.XX.XX ไม่ตอบสนองแม้หลังจากผ่านไป 55 วินาที (lastIO=55000ms) ด้วยเหตุนี้ ตัวประมวลผลข้อความจึงหมดเวลาและส่งข้อผิดพลาด
504 Gateway Timeoutโปรดดูที่หัวข้อ "การควบคุมการหมดเวลาใน Message Processor"
- Message Processor ควบคุมการหมดเวลาอย่างไร โดยปกติแล้ว โปรแกรมประมวลผลข้อความจะ
ตั้งค่าด้วยค่าหมดเวลาเริ่มต้น 55 วินาที) ผ่านพร็อพเพอร์ตี้
HTTPTransport.io.timeout.millisค่าการหมดเวลานี้มีผลกับ API Proxy ทั้งหมดที่เป็นขององค์กรซึ่งให้บริการโดย Message Processor นี้- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 55 วินาที โปรแกรมประมวลผลข้อความจะหมดเวลาและส่งข้อผิดพลาด
504 Gateway Timeoutไปยังไคลเอ็นต์
- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 55 วินาที โปรแกรมประมวลผลข้อความจะหมดเวลาและส่งข้อผิดพลาด
- ค่าการหมดเวลาที่ระบุใน Message Processor สามารถลบล้างได้โดยพร็อพเพอร์ตี้
io.timeout.millisที่ระบุภายใน API Proxy ค่าการหมดเวลานี้ใช้ได้กับพร็อกซี API ที่เฉพาะเจาะจงซึ่งมีการระบุพร็อพเพอร์ตี้ที่กล่าวถึงข้างต้น เช่น หากตั้งค่าio.timeout.millisเป็น 10 วินาทีภายใน API Proxy ระบบจะใช้ค่าการหมดเวลา 10 วินาทีสำหรับ API Proxy นี้โดยเฉพาะ- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 10 วินาทีสำหรับพร็อกซี API ที่เฉพาะเจาะจง
Message Processor จะหมดเวลาและส่งข้อผิดพลาด
504 Gateway Timeoutไปยังไคลเอ็นต์
- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 10 วินาทีสำหรับพร็อกซี API ที่เฉพาะเจาะจง
Message Processor จะหมดเวลาและส่งข้อผิดพลาด
- Message Processor ควบคุมการหมดเวลาอย่างไร โดยปกติแล้ว โปรแกรมประมวลผลข้อความจะ
ตั้งค่าด้วยค่าหมดเวลาเริ่มต้น 55 วินาที) ผ่านพร็อพเพอร์ตี้
ความละเอียด
- ตรวจสอบว่าเหตุใดเซิร์ฟเวอร์แบ็กเอนด์จึงใช้เวลานานกว่า 55 วินาที และดูว่าสามารถแก้ไข/เพิ่มประสิทธิภาพเพื่อให้ตอบสนองได้เร็วขึ้นหรือไม่
- หากไม่สามารถแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์ หรือทราบว่าเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานกว่าระยะหมดเวลาที่กำหนดค่าไว้ ให้ เพิ่มค่าระยะหมดเวลาในเราเตอร์และตัวประมวลผลข้อความเป็นค่าที่เหมาะสม
สถานการณ์ #2 - เราเตอร์หมดเวลาไปก่อนที่ Message Processor/เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับ
คุณอาจได้รับข้อผิดพลาด 504 Gateway Timeout หากเราเตอร์หมดเวลาไปก่อนที่ Message
Processor/เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับ กรณีดังกล่าวอาจเกิดขึ้นได้จากสาเหตุใดสาเหตุหนึ่งต่อไปนี้
- ค่าระยะหมดเวลาที่ตั้งค่าในเราเตอร์สั้นกว่าค่าระยะหมดเวลาที่ตั้งค่าใน Message
Processor เช่น สมมติว่าการหมดเวลาในเราเตอร์คือ 50 วินาที ส่วนการหมดเวลาใน Message
Processor คือ 55 วินาที
หมดเวลาในเราเตอร์ หมดเวลาใน Message Processor 50 วินาที 55 วินาที - ค่าการหมดเวลาใน Message Processor จะถูกลบล้างด้วยค่าการหมดเวลาที่สูงกว่าโดยใช้
พร็อพเพอร์ตี้
io.timeout.millisที่ตั้งค่าไว้ในการกำหนดค่าปลายทางเป้าหมาย ของพร็อกซี APIตัวอย่างเช่น หากตั้งค่าระยะหมดเวลาต่อไปนี้
หมดเวลาในเราเตอร์ หมดเวลาใน Message Processor การหมดเวลาภายในพร็อกซี API 57 วินาที 55 วินาที 120 วินาที แต่
io.timeout.millisตั้งค่าเป็น 120 วินาทีในพร็อกซี API<HTTPTargetConnection> <Properties> <Property name="io.timeout.millis">120000</Property> </Properties> <URL>http://www.apigee.com</URL> </HTTPTargetConnection>จากนั้น Message Processor จะไม่หมดเวลาหลังจาก 55 วินาที แม้ว่าค่าหมดเวลา (55 วินาที) จะน้อยกว่าค่าหมดเวลาในเราเตอร์ (57 วินาที) ก็ตาม เนื่องจากค่าการหมดเวลา 55 วินาทีใน Message Processor จะถูกลบล้างด้วยค่า 120 วินาทีที่ตั้งค่าไว้ใน API Proxy ดังนั้น ค่าการหมดเวลาของ Message Processor สำหรับ API Proxy นี้โดยเฉพาะจะเป็น 120 วินาที
เนื่องจากเราเตอร์มีค่าระยะหมดเวลาต่ำกว่า (57 วินาที) เมื่อเทียบกับ 120 วินาทีที่ตั้งค่าไว้ใน พร็อกซี API เราเตอร์จะหมดเวลาหากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับหลังจากผ่านไป 57 วินาที
การวินิจฉัย
- ตรวจสอบบันทึกการเข้าถึง NGINX
(
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log) -
หากเราเตอร์หมดเวลาไปก่อน Message Processor คุณจะเห็นสถานะ
504ในบันทึกการเข้าถึง NGINX สำหรับคำขอ API ที่เฉพาะเจาะจง และmessage idจาก Message Processor จะได้รับการตั้งค่าเป็น-เนื่องจากเราเตอร์ไม่ได้รับการตอบกลับจาก Message Processor ภายในระยะหมดเวลาที่ตั้งค่าไว้ในเราเตอร์ตัวอย่างรายการบันทึกของ NGINX ที่แสดง 504 เนื่องจากเราเตอร์หมดเวลา

- ในตัวอย่างข้างต้น ให้สังเกตสถานะของ
504ใน NGINX, รหัสข้อความจาก Message Processor คือ-และเวลาที่ผ่านไปทั้งหมดคือ 57.001 วินาที เนื่องจากเราเตอร์หมดเวลา หลังจากผ่านไป 57.001 วินาที และเราไม่ได้รับการตอบกลับจาก Message Processor - ในกรณีนี้ คุณจะเห็นข้อยกเว้น
Broken Pipeในบันทึกตัวประมวลผลข้อความ (/opt/apigee/var/log/edge-message-processor/logs/system.log).2017-06-09 00:00:25,886 org:myorg env:test api:myapi-v1 rev:23 messageid:rrt-mp01-18869-23151-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel(ClientChannel[A:XX.XX.XX.XX:8998 Remote host:YY.YY.YY.YY:51400]@23751 useCount=1 bytesRead=0 bytesWritten=486 age=330465ms lastIO=0ms ) 2017-06-09 00:00:25,887 org:myorg env:test api:myapi-v1 rev:23 messageid:rrt-mp01-18869-23151-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.io.IOException: Broken pipe at com.apigee.nio.channels.ClientOutputChannel.writePending(ClientOutputChannel.java:51) ~[nio-1.0.0.jar:na] at com.apigee.nio.channels.OutputChannel.onWrite(OutputChannel.java:116) ~[nio-1.0.0.jar:na] at com.apigee.nio.channels.OutputChannel.write(OutputChannel.java:81) ~[nio-1.0.0.jar:na] … <snipped>
ข้อผิดพลาดนี้แสดงขึ้นเนื่องจากเมื่อเราเตอร์หมดเวลา ระบบจะปิดการเชื่อมต่อกับ
Message Processor เมื่อ Message Processor ประมวลผลเสร็จแล้ว จะพยายามเขียนคำตอบไปยังเราเตอร์ เนื่องจากระบบปิดการเชื่อมต่อกับเราเตอร์แล้ว คุณจึงเห็น
Broken Pipe exception ในตัวประมวลผลข้อความ
คาดว่าข้อยกเว้นนี้จะปรากฏในสถานการณ์ที่อธิบายไว้ข้างต้น ดังนั้นสาเหตุที่แท้จริงของข้อผิดพลาด 504 Gateway Timeout คือเซิร์ฟเวอร์แบ็กเอนด์ยังคงใช้เวลานานขึ้นในการตอบสนอง
และคุณต้องแก้ไขปัญหานี้
ความละเอียด
- หากเป็นเซิร์ฟเวอร์แบ็กเอนด์ที่กำหนดเอง ให้ทำดังนี้
- ตรวจสอบว่าเหตุใดเซิร์ฟเวอร์แบ็กเอนด์จึงใช้เวลานานในการตอบสนอง และดูว่าสามารถ แก้ไข/เพิ่มประสิทธิภาพเพื่อให้ตอบสนองได้เร็วขึ้นหรือไม่
- หากแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้ หรือทราบว่าเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานาน ให้เพิ่มค่าการหมดเวลาในเราเตอร์และ Message Processor
แนวคิด: ตั้งค่าระยะหมดเวลาในคอมโพเนนต์ต่างๆ ตามลำดับต่อไปนี้
หมดเวลาในไคลเอ็นต์ > หมดเวลาในเราเตอร์ > หมดเวลาในข้อความ โปรเซสเซอร์ > หมดเวลาภายในพร็อกซี API
- หากเป็นเซิร์ฟเวอร์แบ็กเอนด์ NodeJS ให้ทำดังนี้
- ตรวจสอบว่าโค้ด NodeJS เรียกเซิร์ฟเวอร์แบ็กเอนด์อื่นๆ หรือไม่ และใช้เวลานาน ในการส่งคืนการตอบกลับหรือไม่ ตรวจสอบว่าเหตุใดเซิร์ฟเวอร์แบ็กเอนด์จึงใช้เวลานานขึ้นและ แก้ไขปัญหาตามความเหมาะสม
- ตรวจสอบว่า Message Processor มีการใช้งาน CPU หรือหน่วยความจำสูงหรือไม่
- หาก Message Processor ใดมีการใช้งาน CPU สูง ให้สร้าง
thread
dumps ทุกๆ 30 วินาทีโดยใช้คำสั่งต่อไปนี้
JAVA_HOME/bin/jstack -l PID > FILENAME
- หาก Message Processor มีการใช้งานหน่วยความจำสูง ให้สร้าง
heap
dump โดยใช้คำสั่งต่อไปนี้
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- รีสตาร์ท Message Processor โดยใช้คำสั่งด้านล่าง ซึ่งจะช่วยลดการใช้งาน CPU
และหน่วยความจำได้
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- ตรวจสอบการเรียก API เพื่อยืนยันว่ายังมีปัญหาอยู่หรือไม่
- โปรดติดต่อทีมสนับสนุนของ Apigee Edge และระบุ
การดัมพ์เธรด การดัมพ์ฮีป และบันทึกของ Message Processor
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)เพื่อช่วย ตรวจสอบสาเหตุของการใช้งาน CPU/หน่วยความจำสูง
- หาก Message Processor ใดมีการใช้งาน CPU สูง ให้สร้าง
thread
dumps ทุกๆ 30 วินาทีโดยใช้คำสั่งต่อไปนี้
ตรวจสอบสิ่งนี้: เซิร์ฟเวอร์แบ็กเอนด์ NodeJS ใน Message Processor มีการควบคุมการหมดเวลาอย่างไร
|
สถานการณ์ #3 - แอปพลิเคชันไคลเอ็นต์หมดเวลาก่อนที่ Router/Message Processor/เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับ
คุณอาจได้รับข้อผิดพลาด 504 Gateway Timeout หากแอปพลิเคชันไคลเอ็นต์หมดเวลา
ก่อนที่เซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับ กรณีนี้อาจเกิดขึ้นหากคุณทำสิ่งต่อไปนี้
- ค่าระยะหมดเวลาที่ตั้งค่าไว้ในแอปพลิเคชันไคลเอ็นต์ต่ำกว่าค่าระยะหมดเวลาที่ตั้งค่าไว้ใน
เราเตอร์และ Message Processor:
ตัวอย่างเช่น หากตั้งค่าระยะหมดเวลาต่อไปนี้
การหมดเวลาในไคลเอ็นต์ หมดเวลาในเราเตอร์ หมดเวลาใน Message Processor 50 วินาที 57 วินาที 55 วินาที ในกรณีนี้ เวลาทั้งหมดที่ใช้ได้ในการรับการตอบกลับสำหรับคำขอ API ผ่าน Edge คือ <= 50 วินาที ซึ่งรวมถึงเวลาที่ใช้ในการส่งคำขอ API, คำขอที่ Edge (เราเตอร์, Message Processor) ประมวลผล, คำขอที่ส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์ (หากมี), แบ็กเอนด์ที่ประมวลผลคำขอและส่งการตอบกลับ, Edge ที่ประมวลผลการตอบกลับ และสุดท้ายคือส่งกลับไปยังไคลเอ็นต์
หากเราเตอร์ไม่ตอบกลับไคลเอ็นต์ภายใน 50 วินาที ไคลเอ็นต์จะ หมดเวลาและปิดการเชื่อมต่อกับเราเตอร์ ไคลเอ็นต์จะได้รับโค้ดตอบกลับเป็น
504ซึ่งจะทําให้ NGINX ตั้งรหัสสถานะเป็น
499ซึ่งบ่งชี้ว่าไคลเอ็นต์ปิดการเชื่อมต่อ แล้ว
การวินิจฉัย
- หากแอปพลิเคชันไคลเอ็นต์หมดเวลาการเชื่อมต่อก่อนที่จะได้รับการตอบกลับจากเราเตอร์ แอปพลิเคชันจะ
ปิดการเชื่อมต่อกับเราเตอร์ ในกรณีนี้ คุณจะเห็นรหัสสถานะ 499 ใน
บันทึกการเข้าถึง NGINX สำหรับคำขอ API ที่เฉพาะเจาะจง
ตัวอย่างรายการบันทึก NGINX ที่แสดงรหัสสถานะ 499

- ในตัวอย่างข้างต้น โปรดทราบว่าสถานะของ
499ใน NGINX และเวลาที่ผ่านไปทั้งหมดคือ 50.001 วินาที ซึ่งหมายความว่าไคลเอ็นต์หมดเวลาหลังจากผ่านไป 50.001 วินาที - ในกรณีนี้ คุณจะเห็นข้อยกเว้น
Broken Pipeในบันทึกของ Message Processor (/opt/apigee/var/log/edge-message-processor/logs/system.log).
2017-06-09 00:00:25,886 org:myorg env:test api:myapi-v1 rev:23 messageid:rrt-1-11193-11467656-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel(ClientChannel[A:XX.XX.XX.XX:8998 Remote host:YY.YY.YY.YY:51400]@23751 useCount=1 bytesRead=0 bytesWritten=486 age=330465ms lastIO=0ms ) 2017-06-09 00:00:25,887 org:myorg env:test api:myapi-v1 rev:23 messageid:rrt-1-11193-11467656-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.io.IOException: Broken pipe at com.apigee.nio.channels.ClientOutputChannel.writePending(ClientOutputChannel.java:51) ~[nio-1.0.0.jar:na] at com.apigee.nio.channels.OutputChannel.onWrite(OutputChannel.java:116) ~[nio-1.0.0.jar:na] at com.apigee.nio.channels.OutputChannel.write(OutputChannel.java:81) ~[nio-1.0.0.jar:na] … <snipped>
- หลังจากเราเตอร์หมดเวลา ระบบจะปิดการเชื่อมต่อกับ Message Processor เมื่อ
Message Processor ประมวลผลเสร็จแล้ว จะพยายามเขียนการตอบกลับไปยังเราเตอร์
เนื่องจากระบบปิดการเชื่อมต่อกับเราเตอร์แล้ว คุณจึงได้รับ
Broken Pipe exceptionใน Message Processor - ข้อยกเว้นนี้คาดว่าจะเกิดขึ้นภายใต้สถานการณ์ที่อธิบายไว้ข้างต้น ดังนั้นสาเหตุที่แท้จริงของข้อผิดพลาด
504 Gateway Timeoutยังคงเป็นเพราะเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานในการตอบสนอง และคุณต้องแก้ไขปัญหานี้
ความละเอียด
- หากเป็นเซิร์ฟเวอร์แบ็กเอนด์ที่กำหนดเอง ให้ทำดังนี้
- ตรวจสอบเซิร์ฟเวอร์แบ็กเอนด์เพื่อดูว่าเหตุใดจึงใช้เวลานานกว่า 57 วินาที และดูว่าสามารถแก้ไข/เพิ่มประสิทธิภาพเพื่อให้ตอบสนองได้เร็วขึ้นหรือไม่
- หากไม่สามารถแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์ หรือหากทราบว่าเซิร์ฟเวอร์แบ็กเอนด์จะใช้เวลานาน ให้เพิ่มค่าการหมดเวลาในเราเตอร์และ Message Processor
แนวคิด: ตั้งค่าระยะหมดเวลาในคอมโพเนนต์ต่างๆ ตามลำดับต่อไปนี้
หมดเวลาในไคลเอ็นต์ > หมดเวลาในเราเตอร์ > หมดเวลาในข้อความ โปรเซสเซอร์ > หมดเวลาภายในพร็อกซี API
- หากเป็นแบ็กเอนด์ NodeJS ให้ทำดังนี้
- ตรวจสอบว่าโค้ด NodeJS เรียกใช้เซิร์ฟเวอร์แบ็กเอนด์อื่นๆ หรือไม่ และใช้เวลานานในการตอบกลับหรือไม่ ตรวจสอบว่าเหตุใดเซิร์ฟเวอร์แบ็กเอนด์เหล่านั้นจึงใช้เวลานานกว่าปกติ
- ตรวจสอบว่า Message Processor มีการใช้งาน CPU หรือการใช้งานหน่วยความจำสูงหรือไม่
- หาก Message Processor มีการใช้งาน CPU สูง ให้สร้าง
การดัมพ์
เทรดทุกๆ 30 วินาทีโดยใช้คำสั่งต่อไปนี้
JAVA_HOME/bin/jstack -l PID > FILENAME
- หาก Message Processor มีการใช้งานหน่วยความจำสูง ให้สร้าง
ฮีปดัมป์
โดยใช้คำสั่งต่อไปนี้
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- รีสตาร์ท Message Processor โดยใช้คำสั่งด้านล่าง ซึ่งจะช่วยลด
CPU และหน่วยความจำได้
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- ตรวจสอบการเรียก API เพื่อยืนยันว่ายังมีปัญหาอยู่หรือไม่
- ติดต่อทีมสนับสนุนของ Apigee Edge และระบุ
การดัมพ์เธรด การดัมพ์ฮีป และบันทึกของ Message Processor
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)เพื่อช่วยให้ทีมสนับสนุน ตรวจสอบสาเหตุของการใช้งาน CPU/หน่วยความจำสูง
- หาก Message Processor มีการใช้งาน CPU สูง ให้สร้าง
การดัมพ์
เทรดทุกๆ 30 วินาทีโดยใช้คำสั่งต่อไปนี้
เพิ่มค่าการหมดเวลาใน เราเตอร์และ Message Processor
โปรดเลือกค่าการหมดเวลาที่จะตั้งค่าในเราเตอร์และ Message Processor อย่างระมัดระวังตามข้อกำหนดของคุณ อย่าตั้งค่าระยะหมดเวลาให้ใหญ่เกินไปโดยไม่มีเหตุผล หากต้องการความช่วยเหลือ โปรดติดต่อ ทีมสนับสนุนของ Apigee Edge
เราเตอร์
chown apigee:apigee /opt/apigee/customer/application/router.properties
- สร้างไฟล์
/opt/apigee/customer/application/router.propertiesในเครื่องเราเตอร์ หากยังไม่มี - เพิ่มบรรทัดต่อไปนี้ลงในไฟล์นี้
conf_load_balancing_load.balancing.driver.proxy.read.timeout=TIME_IN_SECONDS
เช่น หากต้องการตั้งค่าการหมดเวลาเป็น 120 วินาที ให้ตั้งค่าดังนี้
conf_load_balancing_load.balancing.driver.proxy.read.timeout=120
- ตรวจสอบว่าไฟล์นี้เป็นของ apigee
- รีสตาร์ทเราเตอร์
/opt/apigee/apigee-service/bin/apigee-service edge-router restart
- หากมีเราเตอร์มากกว่า 1 ตัว ให้ทำตามขั้นตอนข้างต้นในเราเตอร์ทั้งหมด
Message Processor
- สร้าง
/opt/apigee/customer/application/message-processor.propertiesในเครื่อง Message Processor หากยังไม่มี - เพิ่มบรรทัดต่อไปนี้ลงในไฟล์นี้
conf_http_HTTPTransport.io.timeout.millis=TIME_IN_MILLISECONDS
เช่น หากต้องการตั้งค่าการหมดเวลาเป็น 120 วินาที ให้ตั้งค่าดังนี้
conf_http_HTTPTransport.io.timeout.millis=120000
- ตรวจสอบว่าไฟล์นี้เป็นของ apigee
chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- รีสตาร์ทตัวประมวลผลข้อความ
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- หากมี Message Processor มากกว่า 1 รายการ ให้ทำตามขั้นตอนข้างต้นใน Message Processor ทั้งหมด
แนวคิด: ตั้งค่าระยะหมดเวลาในคอมโพเนนต์ต่างๆ ตามลำดับต่อไปนี้หมดเวลาในไคลเอ็นต์ > หมดเวลาในเราเตอร์ > หมดเวลาใน Message Processor > หมดเวลาภายใน API Proxy |
Edge ประมวลผลคำขอ API ช้า
หาก Edge ทำงานช้ามากและ/หรือใช้เวลานานในการประมวลผลคำขอ API คุณจะได้รับข้อผิดพลาด 504 Gateway Timeout
การวินิจฉัย
- ติดตาม API ที่ได้รับผลกระทบใน Edge UI
- โปรดรอให้เกิดข้อผิดพลาด หรือหากมีการเรียก API ให้ทำการเรียก API บางรายการ
และจำลองข้อผิดพลาด
504 Gateway Timeout - โปรดทราบว่าในกรณีนี้ คุณอาจเห็นการตอบกลับที่สำเร็จใน Trace
- เราเตอร์/ไคลเอ็นต์หมดเวลาเนื่องจาก Message Processor ไม่ตอบกลับภายใน ระยะหมดเวลาที่ระบุในเราเตอร์/ไคลเอ็นต์ (ซึ่งมีระยะหมดเวลาต่ำสุด) อย่างไรก็ตาม ตัวประมวลผลข้อความจะประมวลผลคำขอต่อไปและอาจดำเนินการ สำเร็จ
- นอกจากนี้ ค่า
HTTPTransport.io.timeout.millisที่ตั้งค่าไว้ใน Message Processor จะทริกเกอร์ก็ต่อเมื่อ Message Processor สื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์ HTTP/HTTPS เท่านั้น กล่าวคือ ระบบจะไม่ทริกเกอร์การหมดเวลานี้เมื่อนโยบายใดก็ตาม (นอกเหนือจากนโยบาย ServiceCallout) ภายใน API Proxy ใช้เวลานาน
- หลังจากเกิดข้อผิดพลาด ให้ตรวจสอบคำขอที่เฉพาะเจาะจงซึ่งมีเวลาที่ผ่านไป นานที่สุด
- ตรวจสอบเวลาที่ผ่านไปในแต่ละเฟสและจดบันทึกเฟสที่ใช้เวลานานที่สุด
- หากคุณสังเกตเห็นเวลาที่ผ่านไปนานที่สุดในนโยบายใดๆ นอกเหนือจากนโยบายข้อความไฮไลต์ของบริการ แสดงว่า Edge ใช้เวลานานในการประมวลผลคำขอ
- ต่อไปนี้คือตัวอย่างการติดตาม UI ที่แสดงเวลาที่ผ่านไปสูงมากในนโยบาย JavaScript

- ในตัวอย่างข้างต้น คุณจะเห็นว่านโยบาย JavaScript ใช้เวลานานผิดปกติประมาณ 245 วินาที
ความละเอียด
- ตรวจสอบว่านโยบายที่ใช้เวลานานในการตอบสนองและมีโค้ดที่กำหนดเองซึ่ง อาจต้องใช้เวลานานในการประมวลผลหรือไม่ หากมีโค้ดดังกล่าว ให้ดูว่าคุณสามารถ แก้ไข/เพิ่มประสิทธิภาพโค้ดที่ระบุได้หรือไม่
- หากไม่มีโค้ดที่กำหนดเองซึ่งอาจทำให้เวลาในการประมวลผลสูง ให้ตรวจสอบว่า Message
Processors มีการใช้งาน CPU หรือหน่วยความจำสูงหรือไม่
- หาก Message Processor มีการใช้งาน CPU สูง ให้สร้าง
thread
dumps ทุกๆ 30 วินาทีโดยใช้คำสั่งต่อไปนี้
JAVA_HOME/bin/jstack -l PID > FILENAME
- หาก Message Processor มีการใช้งานหน่วยความจำสูง ให้สร้าง
ฮีปดัมป์
โดยใช้คำสั่งต่อไปนี้
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- รีสตาร์ท Message Processor โดยใช้คำสั่งด้านล่าง ซึ่งจะช่วยลดการใช้งาน CPU
และหน่วยความจำ
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- ตรวจสอบการเรียก API และยืนยันว่าปัญหายังคงมีอยู่หรือไม่
- ติดต่อทีมสนับสนุนของ Apigee Edge และระบุเธรด
การทิ้ง ฮีปดัมพ์ และบันทึกของ Message Processor
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)เพื่อช่วยให้ทีมสนับสนุน ตรวจสอบสาเหตุของการใช้งาน CPU/หน่วยความจำสูง
- หาก Message Processor มีการใช้งาน CPU สูง ให้สร้าง
thread
dumps ทุกๆ 30 วินาทีโดยใช้คำสั่งต่อไปนี้
วินิจฉัยปัญหาโดยใช้การตรวจสอบ API
การตรวจสอบ API ช่วยให้คุณแยกแยะพื้นที่ที่มีปัญหาได้อย่างรวดเร็วเพื่อวินิจฉัยปัญหาเกี่ยวกับข้อผิดพลาด ประสิทธิภาพ และเวลาในการตอบสนอง รวมถึงแหล่งที่มาของปัญหา เช่น แอปของนักพัฒนาซอฟต์แวร์ พร็อกซี API เป้าหมายแบ็กเอนด์ หรือแพลตฟอร์ม API
ดูสถานการณ์ตัวอย่างที่แสดงวิธีแก้ปัญหา 5xx เกี่ยวกับ API โดยใช้การตรวจสอบ API เช่น คุณอาจต้องการตั้งค่าการแจ้งเตือนเพื่อให้ได้รับการแจ้งเตือนเมื่อจำนวนรหัสสถานะ 504 เกินเกณฑ์ที่เฉพาะเจาะจง