Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về
Apigee X. thông tin
Triệu chứng
Ứng dụng khách nhận được mã trạng thái HTTP là 504
với thông báo Gateway Timeout
làm phản hồi cho các lệnh gọi API.
Mã trạng thái HTTP – lỗi 504 Gateway Timeout
cho biết ứng dụng không nhận được phản hồi kịp thời từ Edge Gateway hoặc máy chủ phụ trợ trong quá trình thực thi API
Thông báo lỗi
Ứng dụng khách nhận được mã phản hồi sau:
HTTP/1.1 504 Gateway Timeout
Trong một số trường hợp, bạn cũng có thể nhận thấy thông báo lỗi sau:
{ "fault": { "faultstring": "Gateway Timeout", "detail": { "errorcode": "messaging.adaptors.http.flow.GatewayTimeout" } } }
Nguyên nhân nào khiến hết thời gian chờ của cổng?
Đường dẫn điển hình cho một yêu cầu API thông qua nền tảng Edge sẽ là Client -> Router -> Message Processor -> Backend Server (Ứng dụng -> Bộ định tuyến -> Trình xử lý tin nhắn -> Máy chủ phụ trợ) như trong hình bên dưới:
Ứng dụng khách, bộ định tuyến và Trình xử lý thông báo trong nền tảng Edge được thiết lập bằng các giá trị thời gian chờ phù hợp. Nền tảng Edge dự kiến sẽ gửi phản hồi trong một khoảng thời gian nhất định cho mỗi yêu cầu API dựa trên các giá trị hết thời gian chờ. Nếu bạn không nhận được phản hồi trong khoảng thời gian đã chỉ định, thì 504 Gateway Timeout Error
sẽ được trả về.
Bảng sau đây cung cấp thêm thông tin chi tiết về thời điểm có thể xảy ra thời gian chờ trong Edge:
Lần hết thời gian chờ | Thông tin chi tiết |
---|---|
Thời gian chờ xảy ra trên Trình xử lý thông báo |
|
Đã hết thời gian chờ trên Trình định tuyến |
|
Hết thời gian chờ trên ứng dụng khách |
|
Các nguyên nhân có thể
Trong Edge, các nguyên nhân thường gặp gây ra lỗi 504 Gateway Timeout
là:
Nguyên nhân | Thông tin chi tiết | Các bước được cung cấp cho |
---|---|---|
Máy chủ phụ trợ bị chậm | Máy chủ phụ trợ đang xử lý yêu cầu API quá chậm do tải cao hoặc hiệu suất kém. | Người dùng đám mây công khai và riêng tư |
Do Edge xử lý yêu cầu API bị chậm | Edge cần nhiều thời gian để xử lý yêu cầu API do mức tải cao hoặc hiệu suất kém. |
Máy chủ phụ trợ chậm
Nếu máy chủ phụ trợ rất chậm hoặc mất nhiều thời gian để xử lý yêu cầu API, thì bạn sẽ gặp lỗi 504 Gateway Timeout
. Như đã giải thích trong phần trên, thời gian chờ có thể xảy ra trong một trong các trường hợp sau:
- Trình xử lý thông báo hết thời gian chờ trước khi máy chủ phụ trợ phản hồi.
- Bộ định tuyến hết thời gian chờ trước khi Trình xử lý thông báo/máy chủ phụ trợ phản hồi.
- Ứng dụng khách hết thời gian chờ trước khi Trình xử lý thông báo/Trình xử lý thông báo/máy chủ phụ trợ phản hồi.
Các phần sau đây mô tả cách chẩn đoán và giải quyết vấn đề trong từng trường hợp.
Trường hợp 1 Bộ xử lý thông báo hết thời gian chờ trước khi máy chủ phụ trợ phản hồi
Chẩn đoán
Bạn có thể sử dụng các quy trình sau để chẩn đoán xem lỗi 504 Gateway Timeout
có xảy ra do máy chủ phụ trợ bị chậm hay không.
Quy trình #1 Sử dụng dấu vết
Nếu vấn đề vẫn tiếp diễn (vẫn xảy ra 504
lỗi), hãy làm theo các bước dưới đây:
- Theo dõi API bị ảnh hưởng trong giao diện người dùng Edge. Chờ lỗi xảy ra hoặc nếu bạn có lệnh gọi API, hãy thực hiện một số lệnh gọi API và tái tạo lỗi
504 Gateway Timeout
. - Sau khi lỗi xảy ra, hãy kiểm tra yêu cầu cụ thể cho thấy mã phản hồi là
504
. - Kiểm tra thời gian đã trôi qua ở mỗi giai đoạn và ghi lại giai đoạn mất nhiều thời gian nhất.
- Nếu bạn thấy lỗi có thời gian trôi qua lâu nhất ngay sau một trong các giai đoạn sau đây, thì tức là máy chủ phụ trợ bị chậm hoặc mất nhiều thời gian để xử lý yêu cầu:
- Đã gửi yêu cầu đến máy chủ mục tiêu
- Chính sách về ServiceCallout
Sau đây là một Dấu vết mẫu cho thấy máy chủ phụ trợ không phản hồi ngay cả sau 55 giây, dẫn đến lỗi 504 Gateway Timeout
:
Trong dấu vết trên, Trình xử lý thông báo hết thời gian chờ sau 55002 mili giây vì máy chủ phụ trợ không phản hồi.
Quy trình số 2 Sử dụng nhật ký Trình xử lý thư
- Kiểm tra nhật ký của Trình xử lý thông báo (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) -
Nếu bạn thấy lỗi
Gateway Timeout
vàonTimeoutRead
cho yêu cầu proxy API cụ thể vào thời điểm cụ thể, thì điều đó cho biết Trình xử lý thông báo đã hết thời gian chờ.Nhật ký Trình xử lý thông báo mẫu cho thấy Lỗi hết thời gian chờ của cổng
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
Trong nhật ký Trình xử lý thông báo ở trên, bạn nhận thấy máy chủ phụ trợ được biểu thị bằng địa chỉ IP XX.XX.XX.XX không phản hồi ngay cả sau 55 giây (lastIO=55000 mili giây). Do đó, Trình xử lý thông báo đã hết thời gian chờ và gửi lỗi
504 Gateway Timeout
.Hãy kiểm tra điều này: Thời gian chờ được kiểm soát như thế nào trên Trình xử lý thông báo?
- Cách kiểm soát thời gian chờ trên Trình xử lý tin nhắn. Trình xử lý thông báo thường được đặt với giá trị thời gian chờ mặc định là 55 giây) thông qua thuộc tính
HTTPTransport.io.timeout.millis
. Giá trị thời gian chờ này có thể áp dụng cho tất cả Proxy API thuộc về một tổ chức được Trình xử lý thông báo này phân phát.- Nếu máy chủ phụ trợ không phản hồi trong vòng 55 giây, thì Trình xử lý thông báo sẽ hết thời gian chờ và gửi lỗi
504 Gateway Timeout
đến máy khách.
- Nếu máy chủ phụ trợ không phản hồi trong vòng 55 giây, thì Trình xử lý thông báo sẽ hết thời gian chờ và gửi lỗi
- Giá trị thời gian chờ được chỉ định trong Trình xử lý thông báo có thể được ghi đè bằng thuộc tính
io.timeout.millis
được chỉ định trong Proxy API. Giá trị thời gian chờ này áp dụng cho một Proxy API cụ thể trong đó thuộc tính được đề cập ở trên được chỉ định. Ví dụ: nếu bạn đặtio.timeout.millis
thành 10 giây trong Proxy API, thì giá trị thời gian chờ là 10 giây sẽ được sử dụng cho Proxy API cụ thể này.- Nếu máy chủ phụ trợ không phản hồi trong vòng 10 giây đối với Proxy API cụ thể, thì Trình xử lý thông báo sẽ hết thời gian chờ và gửi lỗi
504 Gateway Timeout
cho ứng dụng.
- Nếu máy chủ phụ trợ không phản hồi trong vòng 10 giây đối với Proxy API cụ thể, thì Trình xử lý thông báo sẽ hết thời gian chờ và gửi lỗi
- Cách kiểm soát thời gian chờ trên Trình xử lý tin nhắn. Trình xử lý thông báo thường được đặt với giá trị thời gian chờ mặc định là 55 giây) thông qua thuộc tính
Độ phân giải
- Kiểm tra lý do máy chủ phụ trợ mất hơn 55 giây và xem liệu có thể khắc phục/tối ưu hoá máy chủ để phản hồi nhanh hơn hay không.
- Nếu không thể khắc phục/tối ưu hoá máy chủ phụ trợ hoặc bạn biết rằng máy chủ phụ trợ mất nhiều thời gian hơn thời gian chờ đã định cấu hình, thì hãy Tăng giá trị thời gian chờ trên Trình xử lý thông báo và Trình định tuyến lên một giá trị phù hợp.
Tình huống 2 – Bộ định tuyến hết thời gian chờ trước khi Trình xử lý thông báo/máy chủ phụ trợ phản hồi
Bạn có thể gặp lỗi 504 Gateway Timeout
nếu bộ định tuyến hết thời gian chờ trước khi Trình xử lý thông báo/máy chủ phụ trợ phản hồi. Điều này có thể xảy ra trong một trong những trường hợp sau:
- Giá trị thời gian chờ được đặt trên Trình định tuyến ngắn hơn giá trị thời gian chờ được đặt trên Trình xử lý thông báo. Ví dụ: giả sử thời gian chờ trên Bộ định tuyến là 50 giây, trong khi Bộ xử lý thông báo là 55 giây.
Hết thời gian chờ trên bộ định tuyến Hết thời gian chờ trên Trình xử lý thông báo 50 giây 55 giây - Giá trị thời gian chờ trên Trình xử lý thông báo sẽ được ghi đè bằng một giá trị thời gian chờ cao hơn bằng cách sử dụng thuộc tính
io.timeout.millis
được đặt trong cấu hình điểm cuối mục tiêu của Proxy API:Ví dụ: nếu bạn đặt các giá trị thời gian chờ sau:
Hết thời gian chờ trên bộ định tuyến Hết thời gian chờ trên Trình xử lý thông báo Hết thời gian chờ trong Proxy API 57 giây 55 giây 120 giây Tuy nhiên,
io.timeout.millis
được đặt thành 120 giây trong Proxy API:<HTTPTargetConnection> <Properties> <Property name="io.timeout.millis">120000</Property> </Properties> <URL>http://www.apigee.com</URL> </HTTPTargetConnection>
Khi đó, Trình xử lý thư sẽ không hết thời gian chờ sau 55 giây ngay cả khi giá trị thời gian chờ (55 giây) nhỏ hơn giá trị thời gian chờ trên bộ định tuyến (57 giây). Điều này là do giá trị thời gian chờ 55 giây trên Trình xử lý thông báo sẽ bị ghi đè bằng giá trị 120 giây được đặt trong Proxy API. Vì vậy, giá trị thời gian chờ của Trình xử lý thông báo cho Proxy API cụ thể này sẽ là 120 giây.
Vì Bộ định tuyến có giá trị thời gian chờ thấp hơn (57 giây) so với 120 giây được đặt trong Proxy API, nên bộ định tuyến sẽ hết thời gian chờ nếu máy chủ phụ trợ không phản hồi sau 57 giây.
Chẩn đoán
- Kiểm tra nhật ký truy cập NGINX
(
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) -
Nếu bộ định tuyến hết thời gian chờ trước Trình xử lý thông báo, thì bạn sẽ thấy trạng thái của
504
trên nhật ký truy cập NGINX đối với yêu cầu API cụ thể vàmessage id
từ Trình xử lý thông báo sẽ được đặt là-
. Điều này là do Bộ định tuyến không nhận được bất kỳ phản hồi nào từ Trình xử lý thông báo trong khoảng thời gian chờ đã đặt trên bộ định tuyến.Mẫu mục nhập nhật ký NGINX hiển thị 504 do hết thời gian chờ của Trình định tuyến
- Trong ví dụ trên, hãy lưu ý trạng thái của
504
trên NGINX, mã thông báo từ Bộ xử lý thông báo là-
và tổng thời gian đã trôi qua là 57.001 giây. Nguyên nhân là do bộ định tuyến hết thời gian chờ sau 57.001 giây và chúng tôi không nhận được phản hồi nào từ Trình xử lý thông báo. - Trong trường hợp này, bạn sẽ thấy các ngoại lệ
Broken Pipe
trong nhật ký Trình xử lý thông báo (/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>
Lỗi này hiển thị vì khi bộ định tuyến hết thời gian chờ, nó sẽ đóng kết nối với
Bộ xử lý thông báo. Khi hoàn tất quá trình xử lý, Trình xử lý thông báo sẽ cố gắng ghi phản hồi vào bộ định tuyến. Vì kết nối với bộ định tuyến đã bị đóng nên bạn sẽ nhận được Broken Pipe exception
trên Trình xử lý thông báo.
Chúng tôi dự kiến sẽ thấy trường hợp ngoại lệ này trong các trường hợp đã giải thích ở trên. Vì vậy, nguyên nhân thực sự gây ra lỗi 504 Gateway Timeout
vẫn là máy chủ phụ trợ mất nhiều thời gian hơn để phản hồi và bạn cần giải quyết vấn đề đó.
Độ phân giải
- Nếu đó là máy chủ phụ trợ tuỳ chỉnh, thì
- Kiểm tra lý do máy chủ phụ trợ mất nhiều thời gian để phản hồi và xem liệu có thể khắc phục/tối ưu hoá máy chủ phụ trợ để phản hồi nhanh hơn hay không.
- Nếu không thể khắc phục/tối ưu hoá máy chủ phụ trợ hoặc bạn biết rằng máy chủ phụ trợ mất nhiều thời gian, hãy Tăng giá trị thời gian chờ trên Trình xử lý thông báo và Trình định tuyến.
Ý tưởng: Đặt giá trị thời gian chờ trên các thành phần theo thứ tự sau:
Hết thời gian chờ trên ứng dụng > Hết thời gian chờ trên bộ định tuyến > Hết thời gian chờ trên trình xử lý thông báo > Hết thời gian chờ trong proxy API
- Nếu là máy chủ phụ trợ NodeJS, thì:
- Kiểm tra xem mã NodeJS có thực hiện lệnh gọi đến bất kỳ máy chủ phụ trợ nào khác hay không và liệu mã có mất nhiều thời gian để trả về phản hồi hay không. Kiểm tra lý do máy chủ phụ trợ mất nhiều thời gian hơn và khắc phục sự cố cho phù hợp.
- Kiểm tra xem Trình xử lý thông báo có đang sử dụng nhiều CPU hoặc bộ nhớ hay không:
- Nếu có Trình xử lý thông báo đang gặp tình trạng sử dụng CPU cao, hãy tạo 3 tệp kết xuất luồng (thread dump) 30 giây một lần bằng lệnh sau:
JAVA_HOME/bin/jstack -l PID > FILENAME
- Nếu bất kỳ Trình xử lý thông báo nào đang có mức sử dụng bộ nhớ cao, hãy tạo một tệp kết xuất vùng nhớ khối xếp bằng lệnh sau:
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- Khởi động lại Trình xử lý thông báo bằng lệnh bên dưới. Thao tác này sẽ làm giảm CPU và bộ nhớ:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- Theo dõi các lệnh gọi API để xác nhận xem vấn đề có còn tồn tại không.
- Liên hệ với Bộ phận hỗ trợ Apigee Edge và cung cấp tệp kết xuất luồng, tệp báo lỗi và nhật ký Trình xử lý thông báo (
/opt/apigee/var/log/edge-message-processor/logs/system.log)
để giúp điều tra nguyên nhân khiến mức sử dụng CPU/bộ nhớ cao).
- Nếu có Trình xử lý thông báo đang gặp tình trạng sử dụng CPU cao, hãy tạo 3 tệp kết xuất luồng (thread dump) 30 giây một lần bằng lệnh sau:
Kiểm tra vấn đề này: Cách kiểm soát thời gian chờ cho các máy chủ phụ trợ NodeJS trên Trình xử lý thông báo
|
Tình huống #3 – Ứng dụng khách hết thời gian chờ trước khi Trình định tuyến/Trình xử lý thông báo/máy chủ phụ trợ phản hồi
Bạn có thể gặp lỗi 504 Gateway Timeout
nếu ứng dụng khách hết thời gian chờ trước khi máy chủ phụ trợ phản hồi. Tình huống này có thể xảy ra nếu:
- Giá trị thời gian chờ được đặt trên ứng dụng khách thấp hơn giá trị thời gian chờ được đặt trên bộ định tuyến và Trình xử lý thông báo:
Ví dụ: nếu bạn đặt các giá trị thời gian chờ sau:
Hết thời gian chờ trên ứng dụng Hết thời gian chờ trên bộ định tuyến Hết thời gian chờ trên Trình xử lý thông báo 50 giây 57 giây 55 giây Trong trường hợp này, tổng thời gian có thể nhận được phản hồi cho một yêu cầu API thông qua Edge là <= 50 giây. Thông tin này bao gồm thời gian để đưa ra một yêu cầu API, yêu cầu được Edge (Bộ định tuyến, Bộ xử lý thư) xử lý, yêu cầu được gửi đến máy chủ phụ trợ (nếu có), xử lý phần phụ trợ của yêu cầu và gửi phản hồi, Edge xử lý phản hồi và cuối cùng là gửi lại cho máy khách.
Nếu bộ định tuyến không phản hồi máy khách trong vòng 50 giây, thì máy khách sẽ hết thời gian chờ và đóng kết nối với bộ định tuyến. Ứng dụng sẽ nhận được mã phản hồi là
504
.Điều này sẽ khiến NGINX đặt mã trạng thái là
499
cho biết ứng dụng khách đã đóng kết nối.
Chẩn đoán
- Nếu ứng dụng hết thời gian chờ trước khi nhận được phản hồi từ bộ định tuyến, thì ứng dụng sẽ đóng kết nối với bộ định tuyến. Trong trường hợp này, bạn sẽ thấy mã trạng thái 499 trong
nhật ký truy cập NGINX cho yêu cầu API cụ thể.
Mục nhập nhật ký NGINX mẫu cho thấy mã trạng thái 499
- Trong ví dụ trên, hãy lưu ý rằng trạng thái của
499
trên NGINX và tổng thời gian đã trôi qua là 50.001 giây. Điều này cho biết rằng ứng dụng đã hết thời gian chờ sau 50.001 giây. - Trong trường hợp này, bạn sẽ thấy các trường hợp ngoại lệ
Broken Pipe
trong nhật ký của Trình xử lý thông báo (/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>
- Sau khi hết thời gian chờ, Bộ định tuyến sẽ đóng kết nối với Trình xử lý thông báo. Khi hoàn tất quá trình xử lý, Trình xử lý thông báo sẽ cố gắng ghi phản hồi vào Trình định tuyến.
Vì kết nối với Bộ định tuyến đã bị đóng, nên bạn sẽ nhận được
Broken Pipe exception
trên Trình xử lý thông báo. - Trường hợp ngoại lệ này là dự kiến trong các trường hợp được giải thích ở trên. Vì vậy, nguyên nhân thực sự gây ra lỗi
504 Gateway Timeout
vẫn là máy chủ phụ trợ mất nhiều thời gian để phản hồi và bạn cần giải quyết vấn đề đó.
Độ phân giải
- Nếu đó là máy chủ phụ trợ tuỳ chỉnh của bạn thì:
- Kiểm tra máy chủ phụ trợ để xác định lý do máy chủ mất hơn 57 giây và xem liệu có thể khắc phục/tối ưu hoá máy chủ để phản hồi nhanh hơn hay không.
- Nếu không thể khắc phục/tối ưu hoá máy chủ phụ trợ hoặc nếu bạn biết rằng máy chủ phụ trợ sẽ mất nhiều thời gian, hãy tăng giá trị thời gian chờ trên bộ định tuyến và Trình xử lý thông báo.
Ý tưởng: Đặt giá trị thời gian chờ trên các thành phần khác nhau theo thứ tự sau:
Hết thời gian chờ trên ứng dụng > Hết thời gian chờ trên bộ định tuyến > Hết thời gian chờ trên trình xử lý thông báo > Hết thời gian chờ trong proxy API
- Nếu đó là phần phụ trợ NodeJS, thì:
- Kiểm tra xem mã NodeJS có thực hiện lệnh gọi đến bất kỳ máy chủ phụ trợ nào khác hay không và liệu mã đó có mất nhiều thời gian để trả về hay không. Kiểm tra lý do khiến các máy chủ phụ trợ đó mất nhiều thời gian hơn.
- Kiểm tra xem Trình xử lý thông báo có đang sử dụng nhiều CPU hoặc bộ nhớ hay không:
- Nếu Bộ xử lý thông báo đang có mức sử dụng CPU cao, hãy tạo 3 tệp kết xuất luồng (thread dump) 30 giây một lần bằng lệnh sau:
JAVA_HOME/bin/jstack -l PID > FILENAME
- Nếu Trình xử lý thông báo đang có mức sử dụng bộ nhớ cao, hãy tạo một tệp báo lỗi bằng lệnh sau:
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- Khởi động lại Trình xử lý thông báo bằng lệnh bên dưới. Thao tác này sẽ làm giảm CPU và bộ nhớ:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- Giám sát các lệnh gọi API để xác nhận xem vấn đề còn tồn tại hay không.
- Liên hệ với Nhóm hỗ trợ Apigee Edge và cung cấp
tệp kết xuất luồng, tệp kết xuất vùng nhớ khối xếp và nhật ký Trình xử lý thông báo
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)
để giúp họ điều tra nguyên nhân khiến CPU/bộ nhớ sử dụng nhiều.
- Nếu Bộ xử lý thông báo đang có mức sử dụng CPU cao, hãy tạo 3 tệp kết xuất luồng (thread dump) 30 giây một lần bằng lệnh sau:
Tăng giá trị thời gian chờ trên Bộ định tuyến và Trình xử lý thông báo
Chọn giá trị thời gian chờ để đặt trên Trình xử lý thông báo và Trình định tuyến một cách cẩn thận tuỳ thuộc vào yêu cầu của bạn. Không đặt giá trị thời gian chờ lớn một cách tuỳ ý. Nếu bạn cần được hỗ trợ, hãy liên hệ với Bộ phận hỗ trợ Apigee Edge.
Bộ định tuyến
chown apigee:apigee /opt/apigee/customer/application/router.properties
- Tạo tệp
/opt/apigee/customer/application/router.properties
trên máy Bộ định tuyến nếu chưa có. - Thêm dòng sau vào tệp này:
conf_load_balancing_load.balancing.driver.proxy.read.timeout=TIME_IN_SECONDS
Ví dụ: nếu bạn muốn đặt giá trị thời gian chờ là 120 giây, hãy đặt giá trị đó như sau:
conf_load_balancing_load.balancing.driver.proxy.read.timeout=120
- Đảm bảo tệp này thuộc sở hữu của apigee:
- Khởi động lại bộ định tuyến:
/opt/apigee/apigee-service/bin/apigee-service edge-router restart
- Nếu bạn có nhiều bộ định tuyến, hãy lặp lại các bước trên trên tất cả bộ định tuyến.
Trình xử lý tin nhắn
- Tạo tệp
/opt/apigee/customer/application/message-processor.properties
trên máy Trình xử lý thông báo nếu chưa có. - Thêm dòng sau vào tệp này:
conf_http_HTTPTransport.io.timeout.millis=TIME_IN_MILLISECONDS
Ví dụ: nếu bạn muốn đặt giá trị thời gian chờ là 120 giây, hãy đặt giá trị đó như sau:
conf_http_HTTPTransport.io.timeout.millis=120000
- Đảm bảo tệp này thuộc sở hữu của apigee:
chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- Khởi động lại Trình xử lý thông báo:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- Nếu bạn có nhiều Trình xử lý thông báo, hãy lặp lại các bước trên trên tất cả Trình xử lý thông báo.
Ý tưởng: Đặt giá trị thời gian chờ trên các thành phần theo thứ tự sau:Hết thời gian chờ trên ứng dụng > Hết thời gian chờ trên bộ định tuyến > Hết thời gian chờ trên Trình xử lý thông báo > Hết thời gian chờ trong Proxy API |
Edge xử lý yêu cầu API chậm
Nếu Edge rất chậm và/hoặc mất nhiều thời gian để xử lý yêu cầu API, thì bạn sẽ gặp lỗi 504 Gateway Timeout
.
Chẩn đoán
- Theo dõi API bị ảnh hưởng trong giao diện người dùng Edge.
- Hãy đợi lỗi xảy ra hoặc nếu bạn có lệnh gọi API, hãy thực hiện một số lệnh gọi API và tái tạo lỗi
504 Gateway Timeout
. - Lưu ý: trong trường hợp này, bạn có thể thấy một phản hồi thành công trong Dấu vết.
- Bộ định tuyến/ứng dụng hết thời gian chờ vì Trình xử lý thông báo không phản hồi trong khoảng thời gian chờ đã chỉ định trên Bộ định tuyến/ứng dụng (bất kỳ khoảng thời gian chờ nào thấp nhất). Tuy nhiên, Trình xử lý thông báo sẽ tiếp tục xử lý yêu cầu và có thể hoàn tất thành công.
- Ngoài ra, giá trị
HTTPTransport.io.timeout.millis
được đặt trên Bộ xử lý thông báo chỉ kích hoạt nếu Bộ xử lý thông báo giao tiếp với máy chủ phụ trợ HTTP/HTTPS. Nói cách khác, thời gian chờ này sẽ không được kích hoạt khi bất kỳ chính sách nào (ngoài chính sách ServiceCallout) trong Proxy API mất nhiều thời gian.
- Sau khi xảy ra lỗi, hãy kiểm tra yêu cầu cụ thể có thời gian trôi qua lâu nhất.
- Kiểm tra thời gian đã trôi qua ở mỗi giai đoạn và ghi lại giai đoạn mất nhiều thời gian nhất.
- Nếu bạn quan sát thấy thời gian đã trôi qua dài nhất trong bất kỳ chính sách nào khác ngoài chính sách Chú thích dịch vụ, thì điều đó cho biết rằng Edge đang mất nhiều thời gian để xử lý yêu cầu.
- Dưới đây là một dấu vết giao diện người dùng mẫu cho thấy thời gian đã trôi qua rất cao trên Chính sách về JavaScript:
- Trong ví dụ trên, bạn sẽ nhận thấy chính sách JavaScript mất một khoảng thời gian dài bất thường khoảng 245 giây.
Độ phân giải
- Kiểm tra xem chính sách có mất nhiều thời gian để phản hồi hay không và có mã tuỳ chỉnh nào có thể mất nhiều thời gian để xử lý hay không. Nếu có bất kỳ mã nào như vậy, hãy xem bạn có thể sửa/tối ưu hoá mã đã xác định hay không.
- Nếu không có mã tuỳ chỉnh có thể gây ra thời gian xử lý cao, hãy kiểm tra xem Bộ xử lý thông báo có đang sử dụng CPU hoặc mức sử dụng bộ nhớ cao hay không:
- Nếu bất kỳ Trình xử lý thông báo nào đang có mức sử dụng CPU cao, hãy tạo 3 tệp báo lỗi luồng mỗi 30 giây bằng lệnh sau:
JAVA_HOME/bin/jstack -l PID > FILENAME
- Nếu bất kỳ Trình xử lý thông báo nào đang có mức sử dụng Bộ nhớ cao, hãy tạo một tệp kết xuất vùng nhớ khối xếp bằng lệnh sau:
sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
- Khởi động lại Trình xử lý thông báo bằng lệnh bên dưới. Việc này sẽ làm giảm CPU và bộ nhớ.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- Giám sát các lệnh gọi API và xác nhận xem vấn đề còn tồn tại hay không.
- Liên hệ với Nhóm hỗ trợ Apigee Edge và cung cấp tệp báo lỗi luồng, tệp báo lỗi vùng nhớ khối xếp và nhật ký Trình xử lý thông báo (
/opt/apigee/var/log/edge-message-processor/logs/system.log)
) để giúp họ điều tra nguyên nhân khiến CPU/bộ nhớ bị hao tổn.
- Nếu bất kỳ Trình xử lý thông báo nào đang có mức sử dụng CPU cao, hãy tạo 3 tệp báo lỗi luồng mỗi 30 giây bằng lệnh sau:
Chẩn đoán các sự cố bằng tính năng Giám sát API
Tính năng Theo dõi API cho phép bạn nhanh chóng tách riêng các khu vực có vấn đề để chẩn đoán lỗi, hiệu suất và độ trễ cũng như nguồn gốc của các vấn đề đó, chẳng hạn như ứng dụng của nhà phát triển, proxy API, mục tiêu phụ trợ hoặc nền tảng API.
Tiến hành theo một tình huống mẫu minh hoạ cách khắc phục các vấn đề 5xx với API bằng tính năng Theo dõi API. Ví dụ: bạn có thể muốn thiết lập cảnh báo để được thông báo khi số lượng mã trạng thái 504 vượt quá một ngưỡng cụ thể.