एंटीपैटर्न: 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 कोड को एक्ज़ीक्यूट करने वाले थ्रेड को तब तक ब्लॉक रखता है, जब तक बैकएंड, अनुरोध को प्रोसेस नहीं करता और जवाब नहीं देता.

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

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

असर

  1. अगर JavaScript कोड में waitForComplete() को एक साथ लागू करने वाले अनुरोधों की संख्या पहले से तय सीमा से ज़्यादा हो जाती है, तो एपीआई अनुरोध 500 सर्वर में गड़बड़ी और गड़बड़ी का मैसेज 'समय खत्म हो गया' के साथ काम नहीं करेंगे.
  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);

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