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
Chính sách JavaScript trong Apigee Edge cho phép bạn thêm mã tuỳ chỉnh thực thi trong bối cảnh của một luồng proxy API. Ví dụ: bạn có thể dùng mã tuỳ chỉnh trong chính sách JavaScript để:
- Nhận và đặt các biến luồng
- Thực thi logic tuỳ chỉnh và thực hiện xử lý lỗi
- Trích xuất dữ liệu từ các yêu cầu hoặc phản hồi
- Chỉnh sửa URL mục tiêu phụ trợ một cách linh hoạt
- Thêm hoặc xoá tiêu đề một cách linh động khỏi yêu cầu hoặc phản hồi
- Phân tích cú pháp phản hồi JSON
Ứng dụng HTTP
Một tính năng mạnh mẽ của chính sách Javascript là máy khách HTTP. Bạn có thể dùng ứng dụng HTTP (hoặc đối tượng httpClient) để thực hiện một hoặc nhiều lệnh gọi đến các dịch vụ phụ trợ hoặc dịch vụ bên ngoài. Ứng dụng HTTP đặc biệt hữu ích khi bạn cần thực hiện các lệnh gọi đến nhiều dịch vụ bên ngoài và kết hợp các phản hồi trong một API duy nhất.
Mã JavaScript mẫu thực hiện lệnh gọi đến phần phụ trợ bằng đối tượng httpClient
var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
Đối tượng httpClient cung cấp 2 phương thức get và send (send được dùng trong đoạn mã mẫu ở trên) để thực hiện các yêu cầu HTTP. Cả hai phương thức này đều không đồng bộ và trả về một đối tượng exchange trước khi yêu cầu HTTP thực tế hoàn tất.
Các yêu cầu HTTP có thể mất từ vài giây đến vài phút. Sau khi thực hiện một yêu cầu HTTP, bạn cần biết thời điểm yêu cầu đó hoàn tất để có thể xử lý phản hồi từ yêu cầu. Một trong những cách phổ biến nhất để xác định thời điểm hoàn tất yêu cầu HTTP là bằng cách gọi phương thức waitForComplete() của đối tượng exchange.
waitForComplete()
Phương thức waitForComplete() tạm dừng luồng cho đến khi yêu cầu HTTP hoàn tất và một phản hồi (thành công/thất bại) được trả về. Sau đó, bạn có thể xử lý phản hồi từ một dịch vụ phụ trợ hoặc dịch vụ bên ngoài.
Mã JavaScript mẫu có waitForComplete()
var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
// Wait for the asynchronous GET request to finish
exchange.waitForComplete();
// Get and Process the response
if (exchange.isSuccess()) {
var responseObj = exchange.getResponse().content.asJSON;
return responseObj.access_token;
} else if (exchange.isError()) {
throw new Error(exchange.getError());
}
Antipattern
Việc sử dụng waitForComplete() sau khi gửi yêu cầu HTTP trong mã JavaScript sẽ ảnh hưởng đến hiệu suất.
Hãy xem xét đoạn mã JavaScript sau đây gọi waitForComplete() sau khi gửi một yêu cầu HTTP.
Mã cho sample.js
// Send the HTTP request
var exchangeObj = httpClient.get("http://example.com");
// Wait until the request is completed
exchangeObj.waitForComplete();
// Check if the request was successful
if (exchangeObj.isSuccess()) {
response = exchangeObj.getResponse();
context.setVariable('example.status', response1.status);
} else {
error = exchangeObj.getError();
context.setVariable('example.error', 'Woops: ' + error);
}
Trong ví dụ này:
- Mã JavaScript sẽ gửi một yêu cầu HTTP đến API phụ trợ.
- Sau đó, nó gọi
waitForComplete()để tạm dừng quá trình thực thi cho đến khi yêu cầu hoàn tất.API
waitForComplete()khiến luồng đang thực thi mã JavaScript bị chặn cho đến khi phần phụ trợ hoàn tất quá trình xử lý yêu cầu và phản hồi.
Có giới hạn trên về số lượng luồng (30%) có thể thực thi đồng thời mã JavaScript trên một Trình xử lý thông báo tại bất kỳ thời điểm nào. Sau khi đạt đến giới hạn đó, sẽ không có luồng nào để thực thi mã JavaScript. Do đó, nếu có quá nhiều yêu cầu đồng thời thực thi API waitForComplete() trong mã JavaScript, thì các yêu cầu tiếp theo sẽ không thành công và bạn sẽ nhận được thông báo lỗi 500 Internal Server Error và "Timed out" (Đã hết thời gian chờ) ngay cả trước khi chính sách JavaScript hết thời gian chờ.
Nhìn chung, trường hợp này có thể xảy ra nếu phần phụ trợ mất nhiều thời gian để xử lý các yêu cầu hoặc có lưu lượng truy cập cao.
Tác động
- Các yêu cầu API sẽ không thành công với Lỗi máy chủ nội bộ 500 và với thông báo lỗi "Đã hết thời gian chờ" khi số lượng yêu cầu đồng thời thực thi
waitForComplete()trong mã JavaScript vượt quá giới hạn được xác định trước. - Việc chẩn đoán nguyên nhân gây ra vấn đề này có thể khó khăn vì JavaScript gặp lỗi "Hết thời gian chờ" mặc dù thời gian giới hạn cho chính sách JavaScript cụ thể chưa hết.
Phương pháp hay nhất
Sử dụng lệnh gọi lại trong ứng dụng HTTP để đơn giản hoá mã gọi ra và cải thiện hiệu suất, đồng thời tránh sử dụng waitForComplete() trong mã JavaScript. Phương thức này đảm bảo rằng luồng thực thi JavaScript không bị chặn cho đến khi yêu cầu HTTP hoàn tất.
Khi một lệnh gọi lại được dùng, luồng sẽ gửi các yêu cầu HTTP trong mã JavaScript và quay lại nhóm. Vì luồng không còn bị chặn, nên có thể xử lý các yêu cầu khác. Sau khi yêu cầu HTTP hoàn tất và lệnh gọi lại đã sẵn sàng thực thi, một tác vụ sẽ được tạo và thêm vào hàng đợi tác vụ. Một trong các luồng trong nhóm sẽ thực thi lệnh gọi lại dựa trên mức độ ưu tiên của tác vụ.
Mã JavaScript mẫu sử dụng lệnh gọi lại trong httpClient
function onComplete(response,error) {
// Check if the HTTP request was successful
if (response) {
context.setVariable('example.status', response.status);
} else {
context.setVariable('example.error', 'Woops: ' + error);
}
}
// Specify the callback Function as an argument
httpClient.get("http://example.com", onComplete);