Antipattern: JavaScript kodunda WaitForComplete() işlevini kullanma

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Apigee Edge'deki JavaScript politikası, bir 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ütme ve hata işleme gerçekleştirme
  • İsteklerden veya yanıtlardan veri ayıklama
  • Arka uç hedef URL'sini dinamik olarak düzenleme
  • İsteğe veya yanıta dinamik olarak başlık ekleme ya da başlık kaldırma
  • JSON yanıtını ayrıştırma

HTTP istemcisi

JavaScript politikasının güçlü bir özelliği HTTP istemcisidir. Arka uç veya harici hizmetlere bir veya daha fazla çağrı yapmak için HTTP istemcisi (veya httpClient nesnesi) kullanılabilir. HTTP istemcisi, özellikle birden fazla harici hizmete çağrı yapılması ve yanıtların tek bir API'de birleştirilmesi gerektiğinde kullanışlı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 olmak üzere iki yöntem sunar(send yukarıdaki örnek kodda kullanılır). 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 istekleri birkaç saniye ile birkaç dakika arasında sürebilir. Bir HTTP isteği gönderildikten sonra, isteğin yanıtının işlenebilmesi için isteğin ne zaman tamamlandığını bilmek önemlidir. HTTP isteğinin ne zaman tamamlandığı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ığını duraklatır. Ardından, bir arka uç veya harici hizmetten gelen yanıt işlenebilir.

waitForComplete() işlevini 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() kullanmak performans açısından sonuçlar doğurur.

HTTP isteği gönderdikten sonra waitForComplete() işlevini çağıran aşağıdaki JavaScript kodunu inceleyin.

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() işlevini çağırır.

    waitForComplete() API, arka uç isteği işleme ve yanıt verme işlemini tamamlayana kadar JavaScript kodunu yürüten iş parçacığının engellenmesine neden olur.

Bir Mesaj İşleyicisinde herhangi bir zamanda eşzamanlı olarak JavaScript kodu yürütebilecek iş parçacığı sayısında üst sınır (%30) vardır. Bu sınıra ulaşıldıktan sonra JavaScript kodunu yürütmek için kullanılabilir iş parçacığı kalmaz. Bu nedenle, JavaScript kodunda waitForComplete() API'sini yürüten çok fazla eşzamanlı istek varsa sonraki istekler, JavaScript politikası zaman aşımına uğramadan önce bile 500 Internal Server Error ve "Zaman aşımına uğradı" hata mesajıyla başarısız olur.

Genel olarak, arka uç istekleri işlemek için uzun süre bekletiyorsa veya trafik yüksekse bu senaryo oluşabilir.

Etki

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

En İyi Uygulama

HTTP istemcisinde geri çağırma işlevlerini kullanarak çağrı kodu akışını basitleştirin ve performansı artırın. JavaScript kodunda waitForComplete() kullanmaktan kaçının. Bu yöntem, HTTP isteği tamamlanana kadar JavaScript'i 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. İş parçacığı artık engellenmediğinden diğer istekleri işleyebilir. HTTP isteği tamamlandıktan ve geri çağırma yürütülmeye hazır olduktan sonra bir görev oluşturulup görev sırasına eklenir. Havuzdaki iş parçacıklarından biri, görevin önceliğine göre geri çağırmayı 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