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

waiForComplete() के साथ 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() को कॉल करता है.

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

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