Khắc phục lỗi thời gian chạy của chính sách Spike Arrest

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

InvalidMessageWeight

Mã lỗi

policies.ratelimit.InvalidMessageWeight

Nội dung phản hồi lỗi

{
    "fault": {jdoe
        "faultstring": "Invalid message weight value [invalid_value]",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

Ví dụ về thông báo lỗi

{
    "fault": {
        "faultstring": "Invalid message weight value 1.5",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

Nguyên nhân

Lỗi này xảy ra nếu giá trị được chỉ định cho phần tử <MessageWeight> thông qua một biến luồng không hợp lệ (giá trị không phải là số nguyên).

Ví dụ: nếu giá trị của biến luồng được chỉ định cho phần tử <MessageWeight> là 1, 5 (một giá trị không phải là số nguyên), thì lỗi sẽ xảy ra.

Chẩn đoán

  1. Xác định giá trị không hợp lệ được dùng cho phần tử <MessageWeight> trong chính sách Chặn đột biến. Bạn có thể tìm thấy thông tin này trong phần tử faultstring của phản hồi lỗi. Ví dụ: trong lỗi sau, giá trị không hợp lệ được dùng cho phần tử <MessageWeight> là 1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. Kiểm tra tất cả các chính sách Spike Arrest trong API Proxy cụ thể nơi xảy ra lỗi. Có thể có một hoặc nhiều chính sách Spike Arrest trong đó phần tử <MessageWeight> được chỉ định.

    Ví dụ: chính sách sau đây chỉ định giá trị của <MessageWeight> thông qua một biến luồng có tên là message_weight:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate>100ps</Rate>
        <MessageWeight ref="message_weight"/>
    </SpikeArrest>
    
  3. Xác định giá trị của biến được dùng trong phần tử <MessageWeight> của(các) Chính sách chặn đột biến đã xác định. Bạn có thể trích xuất giá trị của biến luồng từ tiêu đề HTTP, tham số truy vấn, tải trọng yêu cầu XML hoặc JSON hoặc xác định trong một chính sách khác.

    1. Xác định vị trí của mã trong API proxy, nơi biến được xác định lần đầu tiên.
    2. Sau khi bạn xác định được chính sách mà biến được xác định và điền sẵn lần đầu tiên, hãy kiểm tra cách đặt giá trị cho biến.
    3. Nếu giá trị của biến luồng khớp với giá trị được xác định trong Bước 1 ở trên, thì đó là nguyên nhân gây ra lỗi.

    Ví dụ: giả sử bạn dùng một chính sách JavaScript trước Chính sách chặn đột biến để đặt biến message_weight dựa trên phương thức yêu cầu như minh hoạ dưới đây:

    var verb = context.getVariable("request.verb");
    context.setVariable("message_weight", "1.5");
    if (verb == 'POST') {
      context.setVariable("message_weight", "2");
    }
    

    Lưu ý rằng giá trị của biến message_weight là 1.5, đây là giá trị không hợp lệ (không phải là số nguyên).

Độ phân giải

Đảm bảo rằng giá trị của phần tử MessageWeight là một giá trị hợp lệ (giá trị số nguyên).

Để sửa ví dụ nêu trên, bạn có thể sửa đổi giá trị của biến message_weight trong JavaScript thành một số nguyên:

var verb = context.getVariable("request.verb");
context.setVariable("message_weight", "1");
if (verb == 'POST') {
  context.setVariable("message_weight", "2");
}

FailedToResolveSpikeArrestRate

Mã lỗi

policies.ratelimit.FailedToResolveSpikeArrestRate

Nội dung phản hồi lỗi

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference [reference] in SpikeArrest policy [api_policy]",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

Ví dụ về thông báo lỗi

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

Nguyên nhân

Lỗi này xảy ra nếu không thể phân giải giá trị tham chiếu đến biến chứa chế độ cài đặt tốc độ trong phần tử <Rate> thành một giá trị trong chính sách Chặn đột biến. Đây là phần tử bắt buộc và được dùng để chỉ định tốc độ giảm đột ngột ở dạng {int}pm hoặc {int}ps. Ví dụ: {int}pm có thể là 500pm, tức là 500 lệnh gọi mỗi phút. Tương tự, giá trị 10ps có nghĩa là 10 lệnh gọi mỗi giây.

Chẩn đoán

  1. Xác định chính sách Chặn đột biến nơi xảy ra lỗi và tên của tham chiếu không thể phân giải đúng cách. Bạn có thể tìm thấy cả hai mục này trong phần tử faultstring của phản hồi lỗi.

    Ví dụ: trong faultstring sau, tên chính sách là SpikeArrest_AuthProxy và giá trị tham chiếu là request.header.rate:

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. Trong tệp XML chính sách Spike Arrest không thành công, hãy xác minh rằng tên của tham chiếu được dùng khớp với tên tham chiếu được xác định trong chuỗi lỗi (bước 1 ở trên). ** **

    Ví dụ: chính sách sau đây đặt phần tử bằng tham chiếu có tên request.header.rate, khớp với nội dung trong faultstring:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate ref="request.header.rate"/>
    </SpikeArrest>
    
    
  3. Xác định xem biến có được xác định và có sẵn trong luồng mà chính sách Chống đột biến đang được thực thi hay không.

  4. Nếu biến là một trong hai trường hợp sau:

    • ngoài phạm vi (không có trong quy trình cụ thể nơi chính sách đang được thực thi) hoặc
    • không thể phân giải (chưa được xác định)

    thì đó là nguyên nhân gây ra lỗi.

    Trong ví dụ minh hoạ ở trên, giá trị của tốc độ chặn đột biến trong phần tử <Rate> được giả định là được truy xuất từ tiêu đề yêu cầu có tên là rate. Tuy nhiên, Edge không thể phân giải request.header.rate. Điều này xảy ra nếu tiêu đề rate không được truyền trong yêu cầu API.

    Sau đây là một yêu cầu API mẫu không truyền tiêu đề rate trong yêu cầu:

        curl -v http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json"
    

    Vì tiêu đề rate không được truyền trong yêu cầu, nên tham chiếu request.header.rate được dùng trong phần tử <Rate> trong chính sách Chống đột biến ở trên là không xác định và do đó không thể phân giải. Vì vậy, bạn sẽ nhận được mã lỗi:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Độ phân giải

Đảm bảo rằng biến được tham chiếu trong phần tử <Rate> tồn tại/được xác định và có sẵn trong luồng cụ thể, nơi chính sách Chặn đột biến đang được thực thi.

Để sửa ví dụ nêu trên, bạn có thể sửa đổi yêu cầu để thêm tiêu đề rate như minh hoạ dưới đây:

curl -v  http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json" -H "rate:30ps"