एंटीपैटर्न: JavaScript कोड में WaitForcomplete() का इस्तेमाल करें

आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं.
जानकारी

Apigee Edge में मौजूद JavaScript नीति की मदद से, कस्टम कोड जोड़ा जा सकता है. यह कोड, एपीआई प्रॉक्सी फ़्लो के कॉन्टेक्स्ट में काम करता है. उदाहरण के लिए, JavaScript नीति में मौजूद कस्टम कोड का इस्तेमाल इन कामों के लिए किया जा सकता है:

  • फ़्लो वैरिएबल पाना और सेट करना
  • कस्टम लॉजिक लागू करना और गड़बड़ी ठीक करना
  • अनुरोधों या जवाबों से डेटा निकालना
  • बैकएंड टारगेट यूआरएल में डाइनैमिक रूप से बदलाव करना
  • किसी अनुरोध या जवाब में हेडर को डाइनैमिक तरीके से जोड़ना या हटाना
  • JSON रिस्पॉन्स को पार्स करना

एचटीटीपी क्लाइंट

JavaScript नीति की एक अहम सुविधा एचटीटीपी क्लाइंट है. एचटीटीपी क्लाइंट (या httpClient ऑब्जेक्ट) का इस्तेमाल, बैकएंड या बाहरी सेवाओं को एक या उससे ज़्यादा कॉल करने के लिए किया जा सकता है. एचटीटीपी क्लाइंट, खास तौर पर तब काम आता है, जब कई बाहरी सेवाओं को कॉल करने और उनके जवाबों को एक ही एपीआई में शामिल करने की ज़रूरत होती है.

httpClient ऑब्जेक्ट के साथ बैकएंड को कॉल करने वाला JavaScript कोड का उदाहरण

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

httpClient ऑब्जेक्ट, एचटीटीपी अनुरोध करने के लिए दो तरीके get और send दिखाता है. ऊपर दिए गए सैंपल कोड में send का इस्तेमाल किया गया है. ये दोनों तरीके एसिंक्रोनस हैं. साथ ही, एचटीटीपी का अनुरोध पूरा होने से पहले ही exchange ऑब्जेक्ट दिखाते हैं.

एचटीटीपी अनुरोधों को पूरा होने में कुछ सेकंड से लेकर कुछ मिनट तक लग सकते हैं. एचटीटीपी अनुरोध करने के बाद, यह जानना ज़रूरी है कि अनुरोध कब पूरा हुआ, ताकि अनुरोध से मिले जवाब को प्रोसेस किया जा सके. एचटीटीपी अनुरोध कब पूरा हुआ, यह पता लगाने का सबसे सामान्य तरीका है कि exchange ऑब्जेक्ट के waitForComplete() तरीके को लागू किया जाए.

waitForComplete()

waitForComplete() तरीके से, थ्रेड को तब तक रोका जाता है, जब तक एचटीटीपी अनुरोध पूरा नहीं हो जाता और जवाब (सफलता/विफलता) नहीं मिल जाता. इसके बाद, बैकएंड या बाहरी सेवा से मिले जवाब को प्रोसेस किया जा सकता है.

waitForComplete() फ़ंक्शन के साथ JavaScript कोड का उदाहरण

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

ऐंटीपैटर्न

JavaScript कोड में एचटीटीपी अनुरोध भेजने के बाद waitForComplete() का इस्तेमाल करने से, परफ़ॉर्मेंस पर असर पड़ेगा.

यहां दिए गए JavaScript कोड पर विचार करें. यह एचटीटीपी अनुरोध भेजने के बाद, waitForComplete() को कॉल करता है.

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

इस उदाहरण में:

  1. JavaScript कोड, बैकएंड एपीआई को एचटीटीपी अनुरोध भेजता है.
  2. इसके बाद, यह waitForComplete() को कॉल करता है, ताकि अनुरोध पूरा होने तक प्रोसेस को रोका जा सके.

    waitForComplete() एपीआई, JavaScript कोड को एक्ज़ीक्यूट करने वाले थ्रेड को तब तक ब्लॉक कर देता है, जब तक बैकएंड अनुरोध को प्रोसेस नहीं कर लेता और जवाब नहीं दे देता.

किसी भी समय, मैसेज प्रोसेसर पर एक साथ JavaScript कोड को एक्ज़ीक्यूट करने वाले थ्रेड की संख्या की ऊपरी सीमा 30% है. सीमा पूरी होने के बाद, JavaScript कोड को लागू करने के लिए कोई थ्रेड उपलब्ध नहीं होगी. इसलिए, अगर JavaScript कोड में waitForComplete() एपीआई को एक साथ कई अनुरोध भेजे जाते हैं, तो बाद के अनुरोध पूरे नहीं होंगे. साथ ही, JavaScript की नीति के टाइम आउट होने से पहले ही, 500 इंटरनल सर्वर की गड़बड़ी और 'टाइम आउट हो गया' गड़बड़ी का मैसेज दिखेगा.

आम तौर पर, ऐसा तब हो सकता है, जब बैकएंड को अनुरोधों को प्रोसेस करने में ज़्यादा समय लगता है या ट्रैफ़िक ज़्यादा होता है.

असर

  1. जब JavaScript कोड में एक साथ waitForComplete() किए जा रहे अनुरोधों की संख्या, पहले से तय की गई सीमा से ज़्यादा हो जाती है, तब एपीआई अनुरोध पूरे नहीं हो पाते. साथ ही, 500 Internal Server Error और 'Timed out' गड़बड़ी का मैसेज दिखता है.
  2. समस्या की वजह का पता लगाना मुश्किल हो सकता है, क्योंकि JavaScript की किसी खास नीति के लिए तय की गई समयसीमा खत्म न होने के बावजूद, JavaScript 'टाइम आउट हो गया' गड़बड़ी के साथ काम नहीं करता.

सबसे सही तरीका

कॉलआउट कोड को बेहतर बनाने और परफ़ॉर्मेंस को बेहतर बनाने के लिए, एचटीटीपी क्लाइंट में कॉलबैक का इस्तेमाल करें. साथ ही, JavaScript कोड में waitForComplete() का इस्तेमाल न करें. इस तरीके से यह पक्का किया जाता है कि एचटीटीपी अनुरोध पूरा होने तक, JavaScript को लागू करने वाला थ्रेड ब्लॉक न हो.

जब कॉलबैक का इस्तेमाल किया जाता है, तो थ्रेड JavaScript कोड में एचटीटीपी अनुरोध भेजता है और वापस पूल में आ जाता है. थ्रेड अब ब्लॉक नहीं है. इसलिए, इसका इस्तेमाल अन्य अनुरोधों को पूरा करने के लिए किया जा सकता है. एचटीटीपी अनुरोध पूरा होने और कॉलबैक के एक्ज़ीक्यूट होने के लिए तैयार होने के बाद, एक टास्क बनाया जाएगा और उसे टास्क की सूची में जोड़ दिया जाएगा. पूल में मौजूद थ्रेड में से कोई एक थ्रेड, टास्क की प्राथमिकता के आधार पर कॉलबैक को एक्ज़ीक्यूट करेगा.

httpClient में कॉलबैक का इस्तेमाल करने वाला JavaScript कोड

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

इस बारे में और पढ़ें