คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP เป็น 504
พร้อมข้อความ Gateway Timeout
เป็นการตอบกลับสำหรับการเรียก API
รหัสสถานะ HTTP - ข้อผิดพลาด 504 Gateway Timeout
บ่งบอกว่าไคลเอ็นต์ไม่ได้รับการตอบกลับจาก Edge Gateway หรือเซิร์ฟเวอร์แบ็กเอนด์ ณ เวลาที่ดำเนินการระหว่าง API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 504 Gateway Timeout
ในบางกรณี คุณอาจพบข้อความแสดงข้อผิดพลาดต่อไปนี้ด้วย
{ "fault": { "faultstring": "Gateway Timeout", "detail": { "errorcode": "messaging.adaptors.http.flow.GatewayTimeout" } } }
การหมดเวลาของเกตเวย์เกิดจากอะไร
เส้นทางทั่วไปสำหรับคำขอ API ผ่านแพลตฟอร์ม Edge จะเป็นไคลเอ็นต์ -> เราเตอร์ -> ผู้ประมวลผลข้อความ -> เซิร์ฟเวอร์แบ็กเอนด์ ดังที่แสดงในรูปภาพด้านล่าง
แอปพลิเคชันไคลเอ็นต์ เราเตอร์ และเครื่องมือประมวลผลข้อความภายในแพลตฟอร์ม Edge จะได้รับการตั้งค่าระยะหมดเวลาที่เหมาะสม แพลตฟอร์ม Edge จะต้องตอบกลับภายในระยะเวลาที่กำหนดสำหรับคำขอ API ทุกรายการตามค่าระยะหมดเวลา หากไม่ได้รับการตอบกลับภายในระยะเวลาที่ระบุ ระบบจะส่ง 504 Gateway Timeout Error
กลับมา
ตารางต่อไปนี้จะแสดงรายละเอียดเพิ่มเติมเกี่ยวกับกรณีที่การหมดเวลาเกิดขึ้นใน Edge
การดำเนินการหมดเวลา | รายละเอียด |
---|---|
การหมดเวลาเกิดขึ้นบนตัวประมวลผลข้อความ |
|
การหมดเวลาเกิดขึ้นบนเราเตอร์ |
|
หมดเวลาในแอปพลิเคชันไคลเอ็นต์ |
|
สาเหตุที่เป็นไปได้
ใน Edge สาเหตุทั่วไปที่ทำให้เกิดข้อผิดพลาด 504 Gateway Timeout
มีดังนี้
สาเหตุ | รายละเอียด | ขั้นตอนที่ให้สำหรับ |
---|---|---|
เซิร์ฟเวอร์แบ็กเอนด์ที่ทำงานช้า | เซิร์ฟเวอร์แบ็กเอนด์ที่ประมวลผลคำขอ API ช้าเกินไปเนื่องจากมีภาระงานสูงหรือประสิทธิภาพไม่ดี | ผู้ใช้ Public และ Private Cloud |
Edge กำลังประมวลผลคำขอ API ที่ช้า | Edge ใช้เวลานานในการดำเนินการตามคำขอ API เนื่องจากมีภาระงานสูงหรือประสิทธิภาพต่ำ |
เซิร์ฟเวอร์แบ็กเอนด์ที่ทำงานช้า
หากเซิร์ฟเวอร์แบ็กเอนด์ทำงานช้ามากหรือใช้เวลานานในการดำเนินการตามคำขอ API คุณจะได้รับข้อผิดพลาด 504 Gateway Timeout
ตามที่อธิบายไว้ในส่วนด้านบน การหมดเวลาอาจเกิดขึ้นได้ในกรณีต่อไปนี้
- ตัวประมวลผลข้อความหมดเวลาก่อนที่เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง
- เราเตอร์หมดเวลาก่อนที่เซิร์ฟเวอร์ตัวประมวลผลข้อความ/เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง
- แอปพลิเคชันไคลเอ็นต์หมดเวลาก่อนที่เราเตอร์/ตัวประมวลผลข้อความ/เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง
หัวข้อต่อไปนี้อธิบายวิธีวิเคราะห์และแก้ไขปัญหาภายใต้สถานการณ์เหล่านี้แต่ละสถานการณ์
สถานการณ์ที่ 1 ตัวประมวลผลข้อความหมดเวลาก่อนที่เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง
การวินิจฉัย
คุณสามารถใช้ขั้นตอนต่อไปนี้เพื่อวิเคราะห์ว่าข้อผิดพลาด 504 Gateway Timeout
เกิดขึ้นเนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ที่ทำงานช้าหรือไม่
ขั้นตอนที่ 1 การใช้การติดตาม
หากยังคงพบปัญหาอยู่ (เกิดข้อผิดพลาด 504
รายการอยู่) ให้ทำตามขั้นตอนด้านล่าง
- ติดตาม API ที่ได้รับผลกระทบใน Edge UI โปรดรอจนกว่าข้อผิดพลาดจะเกิดขึ้นหรือหากคุณมีการเรียก API ให้เรียก API และจําลองข้อผิดพลาด
504 Gateway Timeout
อีกครั้ง - เมื่อเกิดข้อผิดพลาด ให้ตรวจสอบคำขอเฉพาะเจาะจงซึ่งแสดงโค้ดตอบกลับเป็น
504
- ตรวจสอบเวลาที่ผ่านไปในแต่ละเฟสและบันทึกเวลาที่ใช้เวลามากที่สุด
- หากคุณสังเกตเห็นข้อผิดพลาดพร้อมกับเวลาที่ผ่านไปนานที่สุดทันทีหลังจากขั้นตอนใดเฟสต่อไปนี้ ก็แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์ทำงานช้าหรือใช้เวลานานในการดำเนินการตามคำขอ
- ส่งคำขอไปยังเซิร์ฟเวอร์เป้าหมายแล้ว
- นโยบาย Serviceส่วนขยายไฮไลต์
ต่อไปนี้เป็นตัวอย่างการติดตามที่แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบสนองแม้ผ่านไป 55 วินาทีจนทำให้เกิดข้อผิดพลาด 504 Gateway Timeout
แล้ว
ในการติดตามข้างต้น ตัวประมวลผลข้อความหมดเวลาหลังจาก 55, 002 มิลลิวินาที เนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบสนอง
ขั้นตอนที่ 2 การใช้บันทึกของผู้ประมวลผลข้อความ
- ตรวจสอบบันทึกของผู้ประมวลผลข้อความ (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) -
หากพบข้อผิดพลาด
Gateway Timeout
และonTimeoutRead
สำหรับคำขอพร็อกซี API ที่เจาะจงในเวลาที่กำหนด แสดงว่าตัวประมวลผลข้อความหมดเวลาแล้วตัวอย่างบันทึกตัวประมวลผลข้อความที่แสดงข้อผิดพลาดการหมดเวลาของเกตเวย์
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
ในบันทึกตัวประมวลผลข้อความด้านบน คุณสังเกตเห็นว่าเซิร์ฟเวอร์แบ็กเอนด์ซึ่งแสดงด้วยที่อยู่ IP XX.XX.XX.XX ไม่ตอบสนองแม้จะผ่านไป 55 วินาที (lastIO=55000ms) ก็ตาม ผลทำให้ตัวประมวลผลข้อความหมดเวลาและส่งข้อผิดพลาด
504 Gateway Timeout
รายการเลือก: เครื่องมือประมวลผลข้อความมีการควบคุมการหมดเวลาอย่างไร
- วิธีควบคุมการหมดเวลาในเครื่องมือประมวลผลข้อความ ตัวประมวลผลข้อความมักจะกำหนดด้วยค่าระยะหมดเวลาเริ่มต้น 55 วินาที) ผ่านพร็อพเพอร์ตี้
HTTPTransport.io.timeout.millis
ค่าการหมดเวลานี้ใช้ได้กับพร็อกซี API ทั้งหมดที่เป็นขององค์กรที่ให้บริการโดยตัวประมวลผลข้อความนี้- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 55 วินาที ผู้ประมวลผลข้อความจะหมดเวลาและส่งข้อผิดพลาด
504 Gateway Timeout
ไปยังไคลเอ็นต์
- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 55 วินาที ผู้ประมวลผลข้อความจะหมดเวลาและส่งข้อผิดพลาด
- ค่าระยะหมดเวลาที่ระบุในตัวประมวลผลข้อความจะลบล้างโดยพร็อพเพอร์ตี้
io.timeout.millis
ที่ระบุภายในพร็อกซี API ได้ ค่าระยะหมดเวลานี้มีผลกับพร็อกซี API ที่ระบุพร็อพเพอร์ตี้ที่กล่าวถึงข้างต้น เช่น หากตั้งค่าio.timeout.millis
เป็น 10 วินาทีภายในพร็อกซี API ระบบจะใช้ค่าการหมดเวลาเป็น 10 วินาทีสำหรับพร็อกซี API ที่เจาะจงนี้- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 10 วินาทีสำหรับพร็อกซี API ที่เจาะจง ผู้ประมวลผลข้อความจะหมดเวลาและส่งข้อผิดพลาด
504 Gateway Timeout
ไปยังไคลเอ็นต์
- หากเซิร์ฟเวอร์แบ็กเอนด์ไม่ตอบกลับภายใน 10 วินาทีสำหรับพร็อกซี API ที่เจาะจง ผู้ประมวลผลข้อความจะหมดเวลาและส่งข้อผิดพลาด
- วิธีควบคุมการหมดเวลาในเครื่องมือประมวลผลข้อความ ตัวประมวลผลข้อความมักจะกำหนดด้วยค่าระยะหมดเวลาเริ่มต้น 55 วินาที) ผ่านพร็อพเพอร์ตี้
ความละเอียด
- ตรวจสอบสาเหตุที่เซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานกว่า 55 วินาที และดูว่าจะแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์ดังกล่าวได้หรือไม่เพื่อให้ตอบสนองได้เร็วขึ้น
- หากแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้ หรือทราบว่าเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานกว่าระยะหมดเวลาที่กำหนดค่าไว้ ให้ เพิ่มค่าระยะหมดเวลาในเราเตอร์และเครื่องมือประมวลผลข้อความเป็นค่าที่เหมาะสม
สถานการณ์ที่ 2 - เราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความ/เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง
คุณอาจพบข้อผิดพลาด 504 Gateway Timeout
รายการ หากเราเตอร์หมดเวลาก่อนที่เซิร์ฟเวอร์ตัวประมวลผลข้อความ/แบ็กเอนด์จะตอบสนอง ซึ่งอาจเกิดขึ้นภายใต้สถานการณ์ใดกรณีหนึ่งต่อไปนี้
- ค่าการหมดเวลาที่ตั้งไว้บนเราเตอร์สั้นกว่าค่าระยะหมดเวลาที่ตั้งไว้ในตัวประมวลผลข้อความ ตัวอย่างเช่น สมมติว่าระยะหมดเวลาในเราเตอร์คือ 50 วินาที ขณะที่เครื่องมือประมวลผลข้อความคือ 55 วินาที
หมดเวลาบนเราเตอร์ หมดเวลาสำหรับตัวประมวลผลข้อความ 50 วินาที 55 วินาที - ระบบจะลบล้างค่าระยะหมดเวลาในตัวประมวลผลข้อความด้วยค่าระยะหมดเวลาที่สูงขึ้นโดยใช้พร็อพเพอร์ตี้
io.timeout.millis
ที่ตั้งค่าไว้ภายในการกำหนดค่าปลายทางเป้าหมายของพร็อกซี API ดังนี้ตัวอย่างเช่น หากกำหนดค่าระยะหมดเวลาต่อไปนี้ไว้
หมดเวลาบนเราเตอร์ หมดเวลาสำหรับตัวประมวลผลข้อความ ระยะหมดเวลาภายในพร็อกซี 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>
จากนั้นตัวประมวลผลข้อความจะไม่หมดเวลาหลังจากผ่านไป 55 วินาที แม้ว่าค่าระยะหมดเวลา (55 วินาที) จะน้อยกว่าค่าการหมดเวลาบนเราเตอร์ (57 วินาที) นั่นเป็นเพราะค่าระยะหมดเวลา 55 วินาทีในตัวประมวลผลข้อความจะถูกลบล้างโดยค่า 120 วินาทีซึ่งตั้งค่าภายในพร็อกซี API ดังนั้นค่าระยะหมดเวลาของตัวประมวลผลข้อความสำหรับพร็อกซี API ที่เจาะจงนี้จะเป็น 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 จะถูกตั้งค่าเป็น-
เนื่องจากเราเตอร์ไม่ได้รับการตอบกลับใดๆ จากผู้ประมวลผลข้อมูลข้อความภายในระยะหมดเวลาที่กำหนดไว้บนเราเตอร์ตัวอย่างรายการบันทึก NGINX ที่แสดง 504 เนื่องจากหมดเวลาของเราเตอร์
- ในตัวอย่างข้างต้น ให้สังเกตสถานะของ
504
ใน NGINX รหัสข้อความจากเครื่องมือประมวลผลข้อความคือ-
และเวลารวมที่ใช้ไปคือ 57.001 วินาที เนื่องจากเราเตอร์หมดเวลาหลังจากผ่านไป 57.001 วินาทีและไม่ได้รับการตอบกลับใดๆ จากผู้ประมวลผลข้อความ - ในกรณีนี้ คุณจะเห็นข้อยกเว้น
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>
ข้อผิดพลาดนี้ปรากฏขึ้นเนื่องจากเมื่อเราเตอร์หมดเวลา ระบบจะปิดการเชื่อมต่อกับโปรแกรมประมวลผลข้อความ เมื่อตัวประมวลผลข้อความประมวลผลเสร็จแล้ว ระบบจะพยายามเขียนการตอบกลับไปยังเราเตอร์ เนื่องจากการเชื่อมต่อกับเราเตอร์ถูกปิดไปแล้ว คุณจะได้รับ Broken Pipe exception
ในตัวประมวลผลข้อความ
ข้อยกเว้นนี้ควรได้เห็นภายใต้สถานการณ์ที่อธิบายไว้ข้างต้น ดังนั้น สาเหตุที่แท้จริงของข้อผิดพลาด 504 Gateway Timeout
ยังคงเป็นเซิร์ฟเวอร์แบ็กเอนด์ที่ใช้เวลาตอบกลับนานกว่าและคุณต้องแก้ไขปัญหาดังกล่าว
ความละเอียด
- หากเป็นเซิร์ฟเวอร์แบ็กเอนด์ที่กำหนดเอง ให้ทำดังนี้
- ให้ตรวจสอบสาเหตุที่เซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานในการตอบสนอง และดูว่าจะแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์เพื่อให้ตอบสนองเร็วขึ้นได้หรือไม่
- หากแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้ หรือเป็นข้อเท็จจริงที่ทราบกันว่าเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานาน ให้เพิ่มค่าระยะหมดเวลาในเราเตอร์และผู้ประมวลผลข้อความ
แนวคิด: กำหนดค่าระยะหมดเวลาบนคอมโพเนนต์ต่างๆ ตามลำดับต่อไปนี้
ระยะหมดเวลาสำหรับไคลเอ็นต์ > หมดเวลาบนเราเตอร์ > ระยะหมดเวลาสำหรับตัวประมวลผลข้อความ > ระยะหมดเวลาภายในพร็อกซี API
- หากเป็นเซิร์ฟเวอร์แบ็กเอนด์ของ NodeJS ให้ทำดังนี้
- ตรวจสอบว่าโค้ด NodeJS ทำการเรียกไปยังเซิร์ฟเวอร์แบ็กเอนด์อื่นๆ หรือไม่ และใช้เวลานานในการส่งการตอบกลับหรือไม่ ให้ตรวจสอบสาเหตุที่เซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานกว่าปกติ และแก้ไขปัญหาตามความเหมาะสม
- ตรวจสอบว่าตัวประมวลผลข้อความมีการใช้งาน CPU หรือหน่วยความจำสูงหรือไม่
- หากตัวประมวลผลข้อความมีการใช้งาน CPU สูง ให้สร้างดัมพ์ชุดข้อความ 3 รายการทุก 30 วินาทีโดยใช้คำสั่งต่อไปนี้
JAVA_HOME/bin/jstack -l PID > FILENAME
- หากตัวประมวลผลข้อความมีการใช้งานหน่วยความจำสูง ให้สร้างฮีพดัมพ์โดยใช้คำสั่งต่อไปนี้
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- รีสตาร์ทตัวประมวลผลข้อความโดยใช้คำสั่งด้านล่าง ระบบควรทำให้ CPU และหน่วยความจำลดลง:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- ตรวจสอบการเรียก API เพื่อยืนยันว่าปัญหายังคงอยู่หรือไม่
- โปรดติดต่อฝ่ายสนับสนุนของ Apigee Edge และส่งดัมพ์เทรด ฮีพดัมพ์ และบันทึกของผู้ประมวลผลข้อความ (
/opt/apigee/var/log/edge-message-processor/logs/system.log)
เพื่อช่วยตรวจสอบสาเหตุของการใช้งาน CPU/หน่วยความจำสูง
- หากตัวประมวลผลข้อความมีการใช้งาน CPU สูง ให้สร้างดัมพ์ชุดข้อความ 3 รายการทุก 30 วินาทีโดยใช้คำสั่งต่อไปนี้
ตรวจสอบ: วิธีควบคุมการหมดเวลาสำหรับเซิร์ฟเวอร์แบ็กเอนด์ของ NodeJS ในโปรแกรมประมวลผลข้อความ
|
สถานการณ์ที่ 3 - แอปพลิเคชันไคลเอ็นต์หมดเวลาก่อนที่เราเตอร์/ตัวประมวลผลข้อความ/เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง
คุณอาจพบข้อผิดพลาด 504 Gateway Timeout
รายการ หากแอปพลิเคชันไคลเอ็นต์หมดเวลาก่อนที่เซิร์ฟเวอร์แบ็กเอนด์จะตอบสนอง สถานการณ์นี้อาจเกิดขึ้นได้ในกรณีต่อไปนี้
- ค่าการหมดเวลาที่ตั้งไว้ในแอปพลิเคชันไคลเอ็นต์ต่ำกว่าค่าระยะหมดเวลาที่กำหนดไว้ในเราเตอร์และผู้ประมวลผลข้อความ
ตัวอย่างเช่น หากกำหนดค่าระยะหมดเวลาต่อไปนี้ไว้
หมดเวลาเมื่อไคลเอ็นต์ หมดเวลาบนเราเตอร์ หมดเวลาสำหรับตัวประมวลผลข้อความ 50 วินาที 57 วินาที 55 วินาที ในกรณีนี้ เวลารวมทั้งหมดที่ได้รับคำตอบสำหรับคำขอ API ผ่าน Edge คือ <= 50 วินาที ซึ่งรวมถึงเวลาที่ใช้ในการส่งคำขอ API, คำขอที่ Edge (เราเตอร์, ผู้ประมวลผลข้อความ), คำขอที่ส่งไปยังเซิร์ฟเวอร์แบ็กเอนด์ (หากมี), การประมวลผลแบ็กเอนด์คำขอและการตอบกลับ, Edge จะประมวลผลการตอบกลับและส่งกลับไปยังไคลเอ็นต์ในที่สุด
หากเราเตอร์ไม่ตอบสนองต่อไคลเอ็นต์ภายใน 50 วินาที ไคลเอ็นต์จะหมดเวลาและปิดการเชื่อมต่อกับเราเตอร์ ไคลเอ็นต์จะได้รับโค้ดตอบกลับของ
504
ซึ่งจะทำให้ NGINX ตั้งรหัสสถานะ
499
ซึ่งระบุว่าไคลเอ็นต์ปิดการเชื่อมต่อแล้ว
การวินิจฉัย
- หากแอปพลิเคชันไคลเอ็นต์หมดเวลาก่อนที่จะได้รับการตอบกลับจากเราเตอร์ ระบบจะปิดการเชื่อมต่อกับเราเตอร์ ในกรณีนี้ คุณจะเห็นรหัสสถานะ 499 ในบันทึกการเข้าถึง NGINX สำหรับคำขอ API ที่เฉพาะเจาะจง
ตัวอย่างรายการบันทึก NGINX ที่แสดงรหัสสถานะ 499
- ในตัวอย่างข้างต้น โปรดทราบว่าสถานะของ
499
ใน NGINX และเวลารวมที่ผ่านไปคือ 50.001 วินาที ซึ่งเป็นการระบุว่าไคลเอ็นต์หมดเวลาหลังจากผ่านไป 50.001 วินาที - ในกรณีนี้ คุณจะเห็นข้อยกเว้น
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-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>
- หลังจากหมดเวลาเราเตอร์ จะเป็นการปิดการเชื่อมต่อกับเครื่องมือประมวลผลข้อความ เมื่อตัวประมวลผลข้อความประมวลผลเสร็จแล้ว ระบบจะพยายามเขียนการตอบกลับไปยังเราเตอร์
เนื่องจากการเชื่อมต่อกับเราเตอร์ถูกปิดไปแล้ว คุณจึงได้รับ
Broken Pipe exception
อยู่ในเครื่องมือประมวลผลข้อความ - ข้อยกเว้นนี้เป็นไปตามเงื่อนไขที่อธิบายข้างต้น ดังนั้น สาเหตุที่แท้จริงของข้อผิดพลาด
504 Gateway Timeout
ยังคงเป็นเพราะเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานในการตอบสนองและคุณจะต้องแก้ไขปัญหาดังกล่าว
ความละเอียด
- หากเป็นเซิร์ฟเวอร์แบ็กเอนด์ที่กำหนดเอง ให้ทำดังนี้
- ตรวจสอบเซิร์ฟเวอร์แบ็กเอนด์เพื่อหาสาเหตุที่ใช้เวลามากกว่า 57 วินาที และดูว่าจะแก้ไข/เพิ่มประสิทธิภาพให้ตอบสนองได้เร็วขึ้นหรือไม่
- หากแก้ไข/เพิ่มประสิทธิภาพเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้ หรือหากคุณทราบว่าเซิร์ฟเวอร์แบ็กเอนด์จะใช้เวลานาน ให้เพิ่มค่าระยะหมดเวลาในเราเตอร์และผู้ประมวลผลข้อมูลข้อความ
แนวคิด: กำหนดค่าระยะหมดเวลาบนคอมโพเนนต์ต่างๆ ตามลำดับต่อไปนี้
ระยะหมดเวลาสำหรับไคลเอ็นต์ > หมดเวลาบนเราเตอร์ > ระยะหมดเวลาสำหรับตัวประมวลผลข้อความ > ระยะหมดเวลาภายในพร็อกซี API
- หากเป็นแบ็กเอนด์ของ NodeJS ให้ทำดังนี้
- ตรวจสอบว่าโค้ด NodeJS ทำการเรียกไปยังเซิร์ฟเวอร์แบ็กเอนด์อื่นๆ หรือไม่ และใช้เวลานานในการส่งคืนไหม ตรวจสอบว่าเหตุใดเซิร์ฟเวอร์แบ็กเอนด์เหล่านั้นจึงใช้เวลานานกว่า
- ตรวจสอบว่าตัวประมวลผลข้อความมีการใช้งาน CPU หรือหน่วยความจำสูงหรือไม่
- หากตัวประมวลผลข้อความมีการใช้งาน CPU สูง ให้สร้างดัมพ์ชุดข้อความ 3 รายการทุก 30 วินาทีโดยใช้คำสั่งต่อไปนี้
JAVA_HOME/bin/jstack -l PID > FILENAME
- หากตัวประมวลผลข้อความมีการใช้งานหน่วยความจำสูง ให้สร้างฮีพดัมพ์โดยใช้คำสั่งต่อไปนี้
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- รีสตาร์ทตัวประมวลผลข้อความโดยใช้คำสั่งด้านล่าง ซึ่งจะเป็นการลด CPU และหน่วยความจำ:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- ตรวจสอบการเรียก API เพื่อยืนยันว่าปัญหายังคงอยู่หรือไม่
- โปรดติดต่อฝ่ายสนับสนุนของ Apigee Edge และส่งดัมพ์เทรด ฮีพดัมพ์ และบันทึกของผู้ประมวลผลข้อความ (
/opt/apigee/var/log/edge-message-processor/logs/system.log)
เพื่อช่วยตรวจสอบสาเหตุของการใช้งาน CPU/หน่วยความจำสูง
- หากตัวประมวลผลข้อความมีการใช้งาน CPU สูง ให้สร้างดัมพ์ชุดข้อความ 3 รายการทุก 30 วินาทีโดยใช้คำสั่งต่อไปนี้
เพิ่มค่าการหมดเวลาบนเราเตอร์และเครื่องมือประมวลผลข้อความ
เลือกค่าการหมดเวลาที่จะตั้งค่าบนเราเตอร์และเครื่องมือประมวลผลข้อความอย่างรอบคอบ ทั้งนี้ขึ้นอยู่กับข้อกำหนดของคุณ โปรดอย่าตั้งค่าระยะหมดเวลาที่มากโดยไม่มีการควบคุม หากต้องการความช่วยเหลือ โปรดติดต่อทีมสนับสนุนของ 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
- หากมีเครื่องมือประมวลผลข้อความมากกว่า 1 เครื่อง ให้ทำตามขั้นตอนข้างต้นซ้ำในตัวประมวลผลข้อความทั้งหมด
แนวคิด: กำหนดค่าการหมดเวลาในองค์ประกอบต่างๆ ตามลำดับต่อไปนี้:ระยะหมดเวลาสำหรับไคลเอ็นต์ > ระยะหมดเวลาบนเราเตอร์ > ระยะหมดเวลาบนตัวประมวลผลข้อความ > ระยะหมดเวลาภายในพร็อกซีของ API |
Edge ประมวลผลคำขอ API ช้า
หาก Edge ทำงานช้ามากและ/หรือใช้เวลานานมากในการดำเนินการตามคำขอ API คุณจะได้รับข้อผิดพลาด 504 Gateway Timeout
การวินิจฉัย
- ติดตาม API ที่ได้รับผลกระทบใน Edge UI
- โปรดรอจนกว่าข้อผิดพลาดจะเกิดขึ้นหรือหากคุณมีการเรียก API ให้เรียก API และจําลองข้อผิดพลาด
504 Gateway Timeout
อีกครั้ง - โปรดทราบว่าในกรณีนี้ คุณอาจเห็นการตอบกลับที่สำเร็จใน Trace
- เราเตอร์/ไคลเอ็นต์หมดเวลาเนื่องจากผู้ประมวลผลข้อความไม่ตอบกลับภายในระยะเวลาที่กำหนดสำหรับเราเตอร์/ไคลเอ็นต์ (ขึ้นอยู่กับว่าข้อใดมีระยะหมดเวลาน้อยที่สุด) แต่ผู้ประมวลผลข้อความจะยังคงดำเนินการตามคำขอและอาจดำเนินการสำเร็จ
- นอกจากนี้ ค่า
HTTPTransport.io.timeout.millis
ที่ตั้งค่าไว้ในตัวประมวลผลข้อความจะทำงานเมื่อผู้ประมวลผลข้อความสื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์ HTTP/HTTPS เท่านั้น กล่าวคือ ระบบจะไม่ทริกเกอร์การหมดเวลานี้เมื่อนโยบายใดๆ (นอกเหนือจากนโยบาย ServiceAPI) ภายในพร็อกซี API ใช้เวลานาน
- หลังจากเกิดข้อผิดพลาด ให้ตรวจสอบคำขอที่มีเวลาที่ผ่านไปนานที่สุด
- ตรวจสอบเวลาที่ผ่านไปในแต่ละเฟสและจดบันทึกระยะที่ใช้เวลามากที่สุด
- หากเวลาผ่านไปนานที่สุดแล้วในนโยบายอื่นนอกเหนือจากนโยบายคำขอราคาเสนอบริการ แสดงว่า Edge ใช้เวลานานในการดำเนินการตามคำขอ
- นี่คือตัวอย่างการติดตาม UI ที่แสดงเวลาที่ผ่านไปสูงมากในนโยบาย JavaScript
- ในตัวอย่างข้างต้น คุณสังเกตเห็นว่านโยบาย JavaScript ใช้เวลานานผิดปกติประมาณ 245 วินาที
ความละเอียด
- ตรวจสอบว่านโยบายที่ใช้การตอบกลับใช้เวลานานหรือไม่ มีโค้ดที่กำหนดเองที่อาจใช้เวลานานในการประมวลผลหรือไม่ หากมีโค้ดดังกล่าว ให้ดูว่าคุณสามารถแก้ไข/เพิ่มประสิทธิภาพโค้ดที่ระบุได้หรือไม่
- หากไม่มีโค้ดที่กำหนดเองซึ่งอาจทำให้ใช้เวลาในการประมวลผลสูง ให้ตรวจสอบว่าตัวประมวลผลข้อความมีการใช้งาน CPU หรือหน่วยความจำสูงหรือไม่ ดังนี้
- หากตัวประมวลผลข้อความมีการใช้งาน CPU สูง ให้สร้างดัมพ์ชุดข้อความ 3 รายการทุก 30 วินาทีโดยใช้คำสั่งต่อไปนี้
JAVA_HOME/bin/jstack -l PID > FILENAME
- หากผู้ประมวลผลข้อมูลข้อความมีการใช้งานหน่วยความจำสูง ให้สร้างฮีพดัมพ์โดยใช้คำสั่งต่อไปนี้
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- รีสตาร์ทตัวประมวลผลข้อความโดยใช้คำสั่งด้านล่าง ซึ่งจะเป็นการลด CPU และหน่วยความจำ
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- ตรวจสอบการเรียก API และยืนยันว่าปัญหายังคงอยู่
- โปรดติดต่อฝ่ายสนับสนุนของ Apigee Edge และส่งดัมพ์ เทรด ดัมพ์ และบันทึกของผู้ประมวลผลข้อความ (
/opt/apigee/var/log/edge-message-processor/logs/system.log)
เพื่อช่วยตรวจสอบสาเหตุของการใช้งาน CPU/หน่วยความจำสูง
- หากตัวประมวลผลข้อความมีการใช้งาน CPU สูง ให้สร้างดัมพ์ชุดข้อความ 3 รายการทุก 30 วินาทีโดยใช้คำสั่งต่อไปนี้
วินิจฉัยปัญหาโดยใช้ API Monitoring
การตรวจสอบ API ช่วยให้คุณแยกส่วนที่เป็นปัญหาได้อย่างรวดเร็วเพื่อวิเคราะห์ปัญหาเกี่ยวกับข้อผิดพลาด ประสิทธิภาพ และเวลาในการตอบสนองและแหล่งที่มา เช่น แอปของนักพัฒนาซอฟต์แวร์, พร็อกซี API, เป้าหมายแบ็กเอนด์ หรือแพลตฟอร์ม API
ดูสถานการณ์ตัวอย่างที่แสดงวิธีแก้ปัญหา 5xx เกี่ยวกับ API โดยใช้ API Monitoring ตัวอย่างเช่น คุณอาจต้องการตั้งการแจ้งเตือนเมื่อรหัสสถานะ 504 มีจำนวนเกินเกณฑ์ที่กำหนดไว้