Antipattern: JavaScript kodunda WaitForComplete() işlevini kullanma

Apigee Edge belgelerini görüntülüyorsunuz.
Git: Apigee X belgeleri.
bilgi

Apigee Edge'deki JavaScript politikası, API proxy akışı bağlamında yürütülen özel kod eklemenize olanak tanır. Örneğin, JavaScript politikasındaki özel kod şu amaçlarla kullanılabilir:

  • Akış değişkenlerini alma ve ayarlama
  • Özel mantık yürütün ve hata işlemeyi gerçekleştirin
  • İstek veya yanıtlardan veri ayıklama
  • Arka uç hedef URL'sini dinamik olarak düzenle
  • Bir istek veya yanıtta dinamik olarak başlık ekleme ya da kaldırma
  • JSON yanıtını ayrıştırma

HTTP İstemcisi

JavaScript politikasının güçlü bir özelliği HTTP istemcisidir. HTTP istemcisi (veya httpClient nesnesi), arka uca ya da harici hizmetlere bir veya daha fazla çağrı yapmak için kullanılabilir. HTTP istemcisi özellikle, birden fazla harici hizmete çağrı yapmanız ve yanıtları tek bir API'de birleştirmeniz gerektiğinde yararlıdır.

httpClient nesnesiyle arka uca çağrı yapan örnek JavaScript Kodu

var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);

httpClient nesnesi, HTTP istekleri yapmak için get ve send (yukarıdaki örnek kodda send kullanılır) olmak üzere iki yöntem sağlar. Her iki yöntem de eşzamansızdır ve gerçek HTTP isteği tamamlanmadan önce bir exchange nesnesi döndürür.

HTTP isteklerinin tamamlanması birkaç saniye ile birkaç dakika arasında sürebilir. Bir HTTP isteği yapıldıktan sonra, istekten gelen yanıtın işlenebilmesi için isteğin ne zaman tamamlandığını bilmek önemlidir. HTTP isteğinin tamamlanıp tamamlanmadığını belirlemenin en yaygın yollarından biri, exchange nesnesinin waitForComplete() yöntemini çağırmaktır.

waitForComplete()

waitForComplete() yöntemi, HTTP isteği tamamlanana ve bir yanıt (başarı/başarısızlık) döndürülene kadar iş parçacığı duraklatır. Daha sonra, bir arka uçtan veya harici hizmetten gelen yanıt işlenebilir.

waitForComplete() içeren örnek JavaScript kodu

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

JavaScript kodunda HTTP isteği gönderdikten sonra waitForComplete() kullanılması performansı etkiler.

Bir HTTP isteği gönderdikten sonra waitForComplete() işlevini çağıran aşağıdaki JavaScript kodunu göz önünde bulundurun.

sample.js için kod

// 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);
}

Bu örnekte:

  1. JavaScript kodu, arka uç API'sine bir HTTP isteği gönderir.
  2. Ardından, istek tamamlanana kadar yürütmeyi duraklatmak için waitForComplete() öğesini çağırır.

    waitForComplete() API, arka uç isteği işlemeyi tamamlayıp yanıt verene kadar JavaScript kodunu yürüten iş parçacığının engellenmesine neden olur.

Bir İleti İşleyicide herhangi bir zamanda eşzamanlı olarak JavaScript kodu yürütebilen iş parçacığı sayısının (%30) üst sınırı vardır. Bu sınıra ulaşıldıktan sonra, JavaScript kodunu yürütmek için kullanılabilecek iş parçacıkları olmayacaktır. Bu nedenle, JavaScript kodunda waitForComplete() API'sini yürüten çok fazla eşzamanlı istek varsa, sonraki istekler 500 Dahili Sunucu Hatası ve "Zaman aşımına uğradı" ile başarısız olur. zaman aşımına uğramadan önce hata mesajı döndürecektir.

Genel olarak bu durum, arka uçta isteklerin işlenmesi uzun sürerse veya trafik çok yüksekse ortaya çıkabilir.

Etki

  1. API istekleri 500 Dahili Sunucu Hatası ve "Zaman aşımı" hata mesajı ile başarısız olur JavaScript kodunda waitForComplete() yürüten eşzamanlı isteklerin sayısı önceden tanımlanmış sınırı aştığında.
  2. JavaScript "Zaman aşımı" ile başarısız olduğundan sorunun nedenini teşhis etmek zor olabilir. hatasını alırsınız.

En İyi Uygulama

Ek bilgi kodunu basitleştirmek, performansı iyileştirmek ve JavaScript kodunda waitForComplete() kullanmaktan kaçınmak için HTTP istemcisinde geri çağırma özelliklerini kullanın. Bu yöntem, HTTP isteği tamamlanana kadar JavaScript yürüten iş parçacığının engellenmemesini sağlar.

Geri çağırma kullanıldığında, iş parçacığı JavaScript kodundaki HTTP isteklerini gönderir ve havuza geri döner. İleti dizisi artık engellenmediğinden diğer istekleri işlemeye hazırdır. HTTP isteği tamamlandıktan ve geri çağırma yürütülmeye hazır hale geldikten sonra bir görev oluşturulur ve görev sırasına eklenir. Havuzdaki iş parçacıklarından biri, geri çağırmayı görevin önceliğine göre yürütür.

httpClient'ta Geri Çağırmaları kullanan örnek JavaScript kodu

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

Daha fazla bilgi