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 çalışan özel kod eklemenize olanak tanır. Örneğin, JavaScript politikasındaki özel kod şu amaçla kullanılabilir:

  • Akış değişkenlerini alma ve ayarlama
  • Özel mantık yürütme ve hata giderme
  • İstek veya yanıtlardan verileri ayıklama
  • Arka uç hedef URL'sini dinamik olarak düzenleme
  • Bir isteğe veya yanıta dinamik olarak başlık ekleme ya da kaldırma
  • JSON yanıtını ayrıştırma

HTTP İstemcisi

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

httpClient nesnesi ile 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) iki yöntemini gösterir. Her iki yöntem de eşzamansız olup 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 yapıldıktan sonra, istekten gelen yanıtı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ılı/başarısız) alınana kadar iş parçacığını duraklatır. Ardından, bir arka uç veya harici hizmetten gelen yanıt işlenebilir.

WaitForComplete() ile ö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 bir HTTP isteği gönderdikten sonra waitForComplete() kullanmak performansı etkiler.

HTTP isteği gönderdikten sonra waitForComplete() çağrısı yapan aşağıdaki JavaScript kodunu düşünün.

sample.js kodu

// 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 duraklatması için waitForComplete() yöntemini ç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.

Herhangi bir zamanda bir Mesaj İşleyicide JavaScript kodunu aynı anda yürütebilecek iş parçacığı sayısında üst sınır (%30) vardır. Bu sınıra ulaşıldığında, JavaScript kodunu yürütmek için hiçbir iş parçacığı olmaz. Dolayısıyla, JavaScript kodunda waitForComplete() API'yi yürüten çok sayıda eşzamanlı istek varsa, JavaScript politikası zaman aşımına uğramadan önce bile sonraki istekler 500 Dahili Sunucu Hatası ve "Zaman aşımına uğradı" hata mesajıyla başarısız olur.

Bu senaryo genellikle arka ucun istekleri işlemesi uzun sürüyorsa veya yüksek trafik varsa ortaya çıkabilir.

Etki

  1. JavaScript kodunda waitForComplete() öğesini yürüten eşzamanlı istek sayısı önceden tanımlanmış sınırı aştığında, API istekleri 500 Dahili Sunucu Hatası ve "Zaman aşımına uğradı" hata mesajıyla başarısız olur.
  2. Belirli JavaScript politikasının süre sınırı geçmemiş olsa da JavaScript "Zaman aşımına uğradı" hatasıyla başarısız olduğundan sorunun nedenini teşhis etmek zor olabilir.

En İyi Uygulama

Ek bilgi kodunu basitleştirmek, performansı artırmak ve JavaScript kodunda waitForComplete() kullanmaktan kaçınmak için HTTP istemcisinde geri çağırmaları 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ığı HTTP isteklerini JavaScript kodu içinde gönderir ve havuza geri döner. İleti dizisi artık engellenmediğinden diğer istekleri işlemek için kullanılabilir. HTTP isteği tamamlandıktan ve geri çağırma yürütülmeye hazır olduğunda, bir görev oluşturulur ve görev sırasına eklenir. Havuzdaki iş parçacıklarından biri, geri çağırma işlemini görevin önceliğine göre yürütür.

httpClient'de 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