504 Cổng hết thời gian chờ

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 sẽ nhận được mã trạng thái HTTP 504 kèm theo thông báo Gateway Timeout dưới dạng phản hồi cho 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 đây:

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 cổng hết thời gian chờ?

Đường dẫn điển hình cho một yêu cầu API qua nền tảng Edge sẽ là Ứng dụng -> Bộ định tuyến -> Bộ xử lý thông báo -> Máy chủ phụ trợ như trong hình dưới đây:

Ứng dụng, bộ định tuyến và Bộ xử lý thông báo trong nền tảng Edge được thiết lập với 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ị 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 hết thời gian chờ có thể xảy ra trong Edge:

Thời gian chờ xuất hiện Thông tin chi tiết
Thời gian chờ xảy ra trên Trình xử lý thư
  • Máy chủ phụ trợ không phản hồi Trình xử lý thông báo trong khoảng thời gian chờ được chỉ định trên Bộ xử lý thông báo.
  • Bộ xử lý thư hết thời gian chờ và gửi trạng thái phản hồi là 504 Gateway Timeout đến Bộ định tuyến.
Hết thời gian chờ trên Bộ định tuyến
  • Bộ xử lý thông báo không phản hồi với bộ định tuyến trong khoảng thời gian chờ được chỉ định trên Bộ định tuyến.
  • Bộ định tuyến hết thời gian chờ và gửi trạng thái phản hồi dưới dạng 504 Gateway Timeout đến ứng dụng.
Thời gian chờ xảy ra trên ứng dụng
  • Bộ định tuyến không phản hồi ứng dụng trong khoảng thời gian chờ được chỉ định trên bộ định tuyến.
  • Ứng dụng hết thời gian chờ và kết thúc trạng thái phản hồi dưới dạng 504 Gateway Timeout cho người dùng cuối.

Các nguyên nhân có thể

Trong Edge, nguyên nhân thường gây ra lỗi 504 Gateway Timeout là:

Nguyên nhân Thông tin chi tiết Số bước đã đưa ra cho
Máy chủ phụ trợ chậm Máy chủ phụ trợ đang xử lý yêu cầu API quá chậm do tình trạng 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ư
Xử lý yêu cầu API chậm của Edge Edge mất nhiều thời gian để xử lý yêu cầu API do 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:

  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.
  2. Bộ định tuyến hết thời gian chờ trước khi Bộ xử lý thông báo/máy chủ phụ trợ phản hồi.
  3. Ứng dụng khách hết thời gian chờ trước khi Bộ định tuyến/Bộ xử lý thư/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 đề theo từng tình huống.

Tình huống 1 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

Chẩn đoán

Bạn có thể 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ợ chậm hay không.

Quy trình số 1 Sử dụng dấu vết

Nếu vấn đề vẫn còn tiếp diễn (vẫn đang gặp lỗi 504), hãy làm theo các bước dưới đây:

  1. Theo dõi API bị ảnh hưởng trong giao diện người dùng Edge. Hãy chờ cho đến khi 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.
  2. Khi lỗi xảy ra, hãy kiểm tra yêu cầu cụ thể hiển thị mã phản hồi dưới dạng 504.
  3. Kiểm tra thời gian đã trôi qua của mỗi giai đoạn và ghi chú giai đoạn mà người dùng dành nhiều thời gian nhất.
  4. Nếu bạn quan sát thấy lỗi có thời gian dài nhất đã trôi qua ngay sau một trong các giai đoạn sau, 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ủ đích
    • Chính sách về chú thích dịch vụ

Phần sau đây cung cấp 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, Bộ 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 2 Sử dụng nhật ký Trình xử lý thông báo

  1. Kiểm tra nhật ký của Bộ xử lý thư (/opt/apigee/var/log/edge-message-processor/logs/system.log)
  2. Nếu bạn thấy lỗi Gateway TimeoutonTimeoutRead cho yêu cầu proxy API cụ thể tại một thời điểm cụ thể, thì tức là 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ổ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ư đã hết thời gian chờ và gửi lỗi 504 Gateway Timeout.

    Kiểm tra vấn đề này: Cách Trình xử lý thư kiểm soát thời gian chờ?

    • Cách kiểm soát thời gian chờ trên Trình xử lý thư. Đơn vị xử lý thông báo thường được đặt 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 áp dụng cho tất cả các Proxy API thuộc tổ chức do 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.
    • Giá trị thời gian chờ được chỉ định trong Trình xử lý thông báo có thể bị 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 nêu trên được chỉ định. Ví dụ: nếu bạn đặt io.timeout.millis thành 10 giây trong Proxy API, thì giá trị thời gian chờ 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 máy khách.

Độ phân giải

  1. Hãy kiểm tra lý do khiến 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á để phản hồi nhanh hơn hay không.
  2. Nếu không thể khắc phục/tối ưu hoá máy chủ phụ trợ hoặc 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, 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 lên giá trị phù hợp.

Tình huống #2 – Bộ định tuyến hết thời gian chờ trước khi Bộ 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 Bộ 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 các trường hợp sau:

  • Giá trị thời gian chờ được đặt trên Bộ định tuyến ngắn hơn giá trị thời gian chờ được đặt trên Bộ 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 Trình 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ư
    50 giây 55 giây
  • Giá trị thời gian chờ trên Trình xử lý thông báo sẽ bị ghi đè bằng giá trị thời gian chờ cao hơn khi 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 các giá trị thời gian chờ sau đây được đặt:

    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ư 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>
    

    Sau đó, Trình xử lý thông báo sẽ không hết thời gian chờ sau 55 giây, mặc dù 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 của Trình xử lý thông báo sẽ bị giá trị 120 giây đặt trong Proxy API ghi đè. 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

  1. Kiểm tra nhật ký truy cập NGINX (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. 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 của Bộ xử lý thông báo sẽ được đặt là -. Nguyên nhân là do Bộ định tuyến không nhận được phản hồi nào từ Bộ xử lý thông báo trong khoảng thời gian chờ đặt trên bộ định tuyến.

    Mục nhập nhật ký NGINX mẫu cho thấy lỗi 504 do hết thời gian chờ của bộ định tuyến

  3. Trong ví dụ trên, hãy chú ý trạng thái của 504 trên NGINX, mã nhận dạng 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. Điều này 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ừ Bộ xử lý tin nhắn.
  4. Trong trường hợp này, bạn sẽ thấy trường hợp ngoại lệ Broken Pipe trong nhật ký Trình xử lý thư (/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 xuất hiện vì khi hết thời gian chờ, bộ định tuyế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ý, Bộ xử lý thông báo sẽ cố ghi phản hồi cho bộ định tuyến. Vì kết nối với bộ định tuyến đã đóng nên bạn sẽ nhận được Broken Pipe exception trên Bộ xử lý thông báo.

Chúng tôi dự kiến sẽ nhìn thấy ngoại lệ này trong các trường hợp được giải thích ở trên. Vì vậy, nguyên nhân thực tế gây ra lỗi 504 Gateway Timeout vẫn là do máy chủ phụ trợ mất nhiều thời gian hơn để phản hồi, nên bạn cần giải quyết vấn đề đó.

Độ phân giải

  1. Nếu đó là máy chủ phụ trợ tuỳ chỉnh, thì
    1. Hãy kiểm tra lý do khiến 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á để phản hồi nhanh hơn hay không.
    2. Nếu không thể sửa/tối ưu hoá máy chủ phụ trợ hoặc khi 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 Bộ định tuyến và Bộ 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:

      Thời gian chờ trên ứng dụng khách > Thời gian chờ trên bộ định tuyến > Thời gian chờ trên bộ xử lý thư > Thời gian chờ trong proxy API

  2. Nếu đó là máy chủ phụ trợ NodeJS, thì:
    1. 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 không và có mất nhiều thời gian để trả về phản hồi hay không. Hãy kiểm tra lý do khiến các máy chủ phụ trợ mất nhiều thời gian hơn và khắc phục sự cố sao cho phù hợp.
    2. Kiểm tra xem Bộ xử lý thư có đang bị mức sử dụng CPU hoặc Bộ nhớ cao hay không:
      1. Nếu Trình xử lý thông báo gặp phải vấn đề mức sử dụng CPU cao, hãy tạo 3 tệp kết xuất luồng cứ 30 giây một lần bằng lệnh sau:
        JAVA_HOME/bin/jstack -l PID > FILENAME
      2. Nếu có Trình xử lý thông báo đang gặp vấn đề mức sử dụng bộ nhớ cao, hãy tạo một tệp báo lỗi (heap dump) bằng lệnh sau:
        sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
      3. Khởi động lại Bộ xử lý thư bằng lệnh dưới đây. Thao tác này sẽ giảm CPU và bộ nhớ:
        /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
      4. Theo dõi các lệnh gọi API để xác nhận xem vấn đề còn tồn tại hay không.
      5. Liên hệ với Bộ phận hỗ trợ Apigee 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 mức sử dụng CPU/bộ nhớ cao.

Xem bài viết này: Cách kiểm soát thời gian chờ đối với các máy chủ phụ trợ NodeJS trên Bộ xử lý thông báo

  • Máy chủ phụ trợ NodeJS chạy trong quy trình JVM của Trình xử lý thông báo. Giá trị thời gian chờ của máy chủ phụ trợ NodeJS được kiểm soát thông qua thuộc tính http.request.timeout.seconds trong tệp nodejs.properties. Theo mặc định, thuộc tính này được đặt thành 0, nghĩa là thời gian chờ bị tắt theo mặc định cho tất cả các Proxy API thuộc một tổ chức do Đơn vị xử lý thông báo này phân phát. Vì vậy, ngay cả khi một máy chủ phụ trợ NodeJS mất nhiều thời gian, Trình xử lý thông báo cũng sẽ không hết thời gian chờ.
  • Tuy nhiên, nếu máy chủ phụ trợ NodeJS mất nhiều thời gian và nếu thời gian thực hiện yêu cầu API nhiều hơn 57 giây, thì Bộ định tuyến sẽ hết thời gian chờ và gửi lỗi 504 Gateway Timeout cho máy khách.

Tình huống 3 – Ứng dụng hết thời gian chờ trước khi Bộ định tuyến/Bộ xử lý thư/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. Trường hợp này có thể xảy ra nếu:

  1. Giá trị thời gian chờ đặt trên ứng dụng khách thấp hơn giá trị thời gian chờ đặt trên bộ định tuyến và Bộ xử lý thông báo:

    Ví dụ: nếu các giá trị thời gian chờ sau đây được đặt:

    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ư
    50 giây 57 giây 55 giây

    Trong trường hợp này, tổng thời gian có sẵn để nhận được phản hồi cho một yêu cầu API thông qua Edge là <= 50 giây. Khoảng thời gian này bao gồm thời gian cần thiết để đưa ra yêu cầu API, yêu cầu đang được Edge (Bộ định tuyến, Bộ xử lý thông báo) xử lý, yêu cầu được gửi đến máy chủ phụ trợ (nếu có), phần phụ trợ xử lý 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 ứng dụng trong vòng 50 giây thì ứng dụng 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 đã đóng kết nối.

Chẩn đoán

  1. Nếu 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

  2. Trong ví dụ trên, hãy lưu ý 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 ứng dụng khách đã hết thời gian chờ sau 50,001 giây.
  3. Trong trường hợp này, bạn sẽ thấy trường hợp ngoại lệ của Broken Pipe trong nhật ký Trình xử lý thư (/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>
    
    
  4. Sau khi hết thời gian chờ, Bộ định tuyế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ý, Bộ xử lý thông báo sẽ cố ghi phản hồi cho Bộ định tuyến. Vì kết nối với Bộ định tuyến đã đóng nên bạn sẽ nhận được Broken Pipe exception trên Bộ xử lý thông báo.
  5. Trường hợp ngoại lệ này được 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 tế gây ra lỗi 504 Gateway Timeout vẫn là do máy chủ phụ trợ mất nhiều thời gian để phản hồi, nên bạn cần giải quyết vấn đề đó.

Độ phân giải

  1. Nếu đó là máy chủ phụ trợ tuỳ chỉnh của bạn, thì:
    1. Kiểm tra máy chủ phụ trợ để xác định lý do quá trình này mất hơn 57 giây và xem liệu có thể khắc phục/tối ưu hoá để phản hồi nhanh hơn hay không.
    2. Nếu không thể sửa/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à Bộ 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:

      Thời gian chờ trên ứng dụng khách > Thời gian chờ trên bộ định tuyến > Thời gian chờ trên bộ xử lý thư > Thời gian chờ trong proxy API

  2. Nếu đó là phần phụ trợ NodeJS, thì:
    1. 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 không và có mất nhiều thời gian để trả về mã đó hay không. Hãy kiểm tra lý do tại sao các máy chủ phụ trợ đó mất nhiều thời gian hơn.
    2. Kiểm tra xem Bộ xử lý thư có gặp vấn đề mức sử dụng CPU hoặc bộ nhớ cao hay không:
      1. Nếu Trình xử lý thông báo gặp phải mức sử dụng CPU cao, hãy tạo 3 tệp kết xuất luồng cứ 30 giây một lần bằng lệnh sau:
        JAVA_HOME/bin/jstack -l PID > FILENAME
      2. Nếu Trình xử lý thông báo đang sử dụng nhiều bộ nhớ, hãy tạo một tệp báo lỗi (heap dump) bằng lệnh sau:
        sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
      3. Khởi động lại Bộ xử lý thư bằng lệnh dưới đây. 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
      4. Theo dõi các lệnh gọi API để xác nhận xem vấn đề còn tồn tại hay không.
      5. Liên hệ với Bộ phận hỗ trợ API API 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 họ điều tra nguyên nhân dẫn đến mức sử dụng CPU/bộ nhớ cao.

Tăng giá trị thời gian chờ trên Bộ định tuyến và Trình xử lý thư

Chọn giá trị thời gian chờ cần đặt trên Bộ định tuyến và Trình xử lý thư một cách cẩn thận tuỳ theo yêu cầu của bạn. Không được đặt giá trị thời gian chờ lớn tuỳ ý. Nếu bạn cần hỗ trợ, hãy liên hệ với Nhóm hỗ trợ Apigee.

Bộ định tuyến

chown apigee:apigee /opt/apigee/customer/application/router.properties
  1. Tạo tệp /opt/apigee/customer/application/router.properties trên máy Bộ định tuyến nếu chưa có tệp này.
  2. 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 như sau:

    conf_load_balancing_load.balancing.driver.proxy.read.timeout=120
  3. Đảm bảo tệp này thuộc sở hữu của apigee:
  4. Khởi động lại bộ định tuyến:
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
    
  5. Nếu bạn có nhiều bộ định tuyến, hãy lặp lại các bước trên cho tất cả bộ định tuyến.

Bộ xử lý thư

  1. Tạo tệp /opt/apigee/customer/application/message-processor.properties trên máy xử lý thư nếu chưa có tệp này.
  2. 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 như sau:

    conf_http_HTTPTransport.io.timeout.millis=120000
  3. Đả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
  4. Khởi động lại bộ xử lý thư:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
  5. 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 cho tất cả các Trình xử lý thông báo.

Ý tưởng: Đặt giá trị hết thời gian chờ trên các thành phần khác nhau theo thứ tự sau:

Thời gian chờ trên ứng dụng > Thời gian chờ trên bộ định tuyến > Thời gian chờ trên bộ xử lý thư > 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

  1. Theo dõi API bị ảnh hưởng trong giao diện người dùng Edge.
  2. Hãy chờ cho đến khi 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.
  3. 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.
    1. Bộ định tuyến/ứng dụng hết thời gian chờ do Bộ xử lý thông báo không phản hồi lại trong khoảng thời gian chờ được chỉ định trên Bộ định tuyến/ứng dụng (bất kể bộ định tuyến nào có khoảng thời gian chờ 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ể xử lý thành công.
    2. Ngoài ra, giá trị HTTPTransport.io.timeout.millis được đặt trên Trình xử lý thông báo chỉ kích hoạt khi Trình xử lý thông báo giao tiếp với một 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 có bất kỳ chính sách nào (ngoài chính sách Chú thích dịch vụ) trong Proxy API mất nhiều thời gian.
  4. Sau khi lỗi xảy ra, hãy kiểm tra yêu cầu cụ thể có thời gian dài nhất đã trôi qua.
  5. Kiểm tra thời gian đã trôi qua của mỗi giai đoạn và ghi chú giai đoạn người dùng dành nhiều thời gian nhất.
  6. Nếu bạn quan sát thấy thời gian dài nhất đã trôi qua 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 Edge đang mất nhiều thời gian để xử lý yêu cầu.
  7. Dưới đây là dấu vết giao diện người dùng mẫu cho thấy thời gian rất lâu đã trôi qua theo Chính sách JavaScript:

  8. Trong ví dụ trên, bạn nhận thấy rằng 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

  1. Kiểm tra xem liệu chính sách có mất nhiều thời gian để phản hồi hay không và liệu có bất kỳ mã tuỳ chỉnh nào cần 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 liệu bạn có thể sửa/tối ưu hoá mã đã xác định được hay không.
  2. Nếu không có mã tuỳ chỉnh nào có thể gây ra thời gian xử lý cao, hãy kiểm tra xem Trình xử lý thư có đang sử dụng CPU hoặc bộ nhớ cao hay không:
    1. Nếu Trình xử lý thông báo gặp phải vấn đề mức sử dụng CPU cao, hãy tạo 3 tệp kết xuất luồng cứ 30 giây một lần bằng lệnh sau:
      JAVA_HOME/bin/jstack -l PID > FILENAME
    2. Nếu có Trình xử lý tin nhắn có mức sử dụng Bộ nhớ cao, hãy tạo một tệp báo lỗi (heap dump) bằng lệnh sau:
      sudo -u apigee JAVA_HOME/bin/jmap -dump:live,format=b,file=FILENAME PID
    3. Khởi động lại Bộ xử lý thư bằng lệnh dưới đây. 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
    4. Theo dõi các lệnh gọi API và xác nhận xem vấn đề còn tồn tại hay không.
    5. Liên hệ với Bộ phận hỗ trợ API API 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 họ điều tra nguyên nhân mức sử dụng CPU/bộ nhớ cao.

Chẩn đoán vấn đề bằng tính năng Giám sát API

Giám sát API giúp bạn nhanh chóng tách biệt các khu vực có vấn đề để chẩn đoán lỗi, các vấn đề về hiệu suất và độ trễ cũng như các vấn đề liên quan đến nguồn gây ra vấn đề, chẳng hạn như các ứng dụng dành cho nhà phát triển, proxy API, mục tiêu phụ trợ hoặc nền tảng API.

Xem tình huống mẫu minh hoạ cách khắc phục sự cố 5xx xảy ra với API bằng tính năng Giám sát API. Ví dụ: có thể bạn muốn thiết lập cảnh báo để nhận thông báo khi số lượng mã trạng thái 504 vượt quá một ngưỡng cụ thể.