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 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
  • 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 Trình xử lý thông báo.
  • Trình xử lý thông báo 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 Trình định tuyến.
Đã hết thời gian chờ trên Trình định tuyến
  • Trình xử lý thông báo không phản hồ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 khách.
Hết thời gian chờ trên ứng dụng khách
  • Bộ định tuyến không phản hồi ứng dụng khách trong khoảng thời gian chờ được chỉ định trên bộ định tuyến.
  • Ứng dụng Máy khách hết thời gian chờ và kết thúc trạng thái phản hồi là 504 Gateway Timeout cho người dùng cuối.

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:

  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.
  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.
  3. Ứ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:

  1. 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.
  2. 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.
  3. 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.
  4. 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ư

  1. 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)
  2. Nếu bạn thấy lỗi Gateway TimeoutonTimeoutRead 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.
    • 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 đặt io.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.

Độ phân giải

  1. 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.
  2. 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

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

  3. 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.
  4. 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

  1. Nếu đó là máy chủ phụ trợ tuỳ chỉnh, thì
    1. 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.
    2. 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

  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 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.
    2. 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:
      1. 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
      2. 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
      3. 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
      4. 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.
      5. 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).

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

  • 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ờ cho 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, tức là thời gian chờ bị tắt theo mặc định cho tất cả Proxy API thuộc một tổ chức do Trình xử lý thông báo này phân phát. Vì vậy, ngay cả khi máy chủ phụ trợ NodeJS mất nhiều thời gian, Trình xử lý thông báo 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 > 57 giây, thì Trình định tuyến sẽ hết thời gian chờ và gửi lỗi 504 Gateway Timeout đến ứng dụng.

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:

  1. 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

  1. 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

  2. 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.
  3. 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>
    
    
  4. 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.
  5. 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

  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 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.
    2. 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

  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 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.
    2. 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:
      1. 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
      2. 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
      3. 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
      4. 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.
      5. 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.

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

Trình xử lý tin nhắn

  1. 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ó.
  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 giá trị đó 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 Trình xử lý thông báo:
    /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 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

  1. Theo dõi API bị ảnh hưởng trong giao diện người dùng Edge.
  2. 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.
  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ờ 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.
    2. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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:

  8. 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

  1. 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.
  2. 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:
    1. 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
    2. 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
    3. 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
    4. 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.
    5. 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.

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ể.