অ্যান্টিপ্যাটার্ন: জাভাস্ক্রিপ্ট কোডে waitForComplete() ব্যবহার করুন

আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশনে যান
তথ্য

Apigee Edge-এ JavaScript নীতি আপনাকে কাস্টম কোড যোগ করার অনুমতি দেয় যা একটি API প্রক্সি প্রবাহের প্রেক্ষাপটে কার্যকর হয়। উদাহরণস্বরূপ, জাভাস্ক্রিপ্ট নীতিতে কাস্টম কোড ব্যবহার করা যেতে পারে:

  • প্রবাহ ভেরিয়েবলগুলি পান এবং সেট করুন
  • কাস্টম লজিক এক্সিকিউট করুন এবং ফল্ট হ্যান্ডলিং সঞ্চালন করুন
  • অনুরোধ বা প্রতিক্রিয়া থেকে ডেটা বের করুন
  • গতিশীলভাবে ব্যাকএন্ড লক্ষ্য URL সম্পাদনা করুন
  • একটি অনুরোধ বা প্রতিক্রিয়া থেকে গতিশীলভাবে শিরোনাম যোগ করুন বা সরান
  • একটি JSON প্রতিক্রিয়া পার্স করুন

HTTP ক্লায়েন্ট

জাভাস্ক্রিপ্ট নীতির একটি শক্তিশালী বৈশিষ্ট্য হল HTTP ক্লায়েন্ট । HTTP ক্লায়েন্ট (বা httpClient অবজেক্ট) ব্যাকএন্ড বা বাহ্যিক পরিষেবাগুলিতে এক বা একাধিক কল করতে ব্যবহার করা যেতে পারে। এইচটিটিপি ক্লায়েন্ট বিশেষভাবে উপযোগী যখন একাধিক বাহ্যিক পরিষেবাগুলিতে কল করার এবং একটি একক API-এ প্রতিক্রিয়াগুলিকে ম্যাশ করার প্রয়োজন হয়৷

httpClient অবজেক্টের সাথে ব্যাকএন্ডে কল করার নমুনা জাভাস্ক্রিপ্ট কোড

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

HTTP অনুরোধ করার জন্য httpClient অবজেক্ট দুটি মেথড get এবং send (উপরের নমুনা কোডে send হয়েছে) প্রকাশ করে। উভয় পদ্ধতিই অ্যাসিঙ্ক্রোনাস এবং প্রকৃত HTTP অনুরোধ সম্পূর্ণ হওয়ার আগে একটি exchange বস্তু ফেরত দেয়।

HTTP অনুরোধগুলি কয়েক সেকেন্ড থেকে কয়েক মিনিট সময় নিতে পারে। একটি HTTP অনুরোধ করার পরে, এটি কখন সম্পূর্ণ হবে তা জানা গুরুত্বপূর্ণ, যাতে অনুরোধের প্রতিক্রিয়া প্রক্রিয়া করা যায়। HTTP অনুরোধ কখন সম্পূর্ণ হবে তা নির্ধারণ করার সবচেয়ে সাধারণ উপায়গুলির মধ্যে একটি হল exchange বস্তুর waitForComplete() পদ্ধতি ব্যবহার করে।

waitForComplete()

HTTP অনুরোধ সম্পূর্ণ না হওয়া পর্যন্ত waitForComplete() পদ্ধতিটি থ্রেডকে বিরতি দেয় এবং একটি প্রতিক্রিয়া (সফল/ব্যর্থতা) ফিরে না আসা পর্যন্ত। তারপর, একটি ব্যাকএন্ড বা বহিরাগত পরিষেবা থেকে প্রতিক্রিয়া প্রক্রিয়া করা যেতে পারে।

waitForComplete() সহ জাভাস্ক্রিপ্ট কোডের নমুনা

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 কোডে HTTP অনুরোধ পাঠানোর পর waitForComplete() ব্যবহার করলে কর্মক্ষমতার প্রভাব থাকবে।

নিম্নলিখিত জাভাস্ক্রিপ্ট কোডটি বিবেচনা করুন যা একটি HTTP অনুরোধ পাঠানোর পরে 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. জাভাস্ক্রিপ্ট কোড একটি ব্যাকএন্ড API এ একটি HTTP অনুরোধ পাঠায়।
  2. অনুরোধটি সম্পূর্ণ না হওয়া পর্যন্ত এটি সম্পাদনাকে বিরতি দেওয়ার জন্য waitForComplete() কল করে।

    waitForComplete() API-এর কারণে যে থ্রেডটি জাভাস্ক্রিপ্ট কোড নির্বাহ করছে তা ব্লক করা হবে যতক্ষণ না ব্যাকএন্ড অনুরোধটি প্রক্রিয়াকরণ সম্পূর্ণ করে এবং উত্তর না দেয়।

থ্রেডের সংখ্যার (30%) উপর একটি ঊর্ধ্ব সীমা রয়েছে যা যেকোন সময় একটি বার্তা প্রসেসরে একই সাথে জাভাস্ক্রিপ্ট কোড চালাতে পারে। সেই সীমাতে পৌঁছানোর পরে, জাভাস্ক্রিপ্ট কোড চালানোর জন্য কোন থ্রেড উপলব্ধ থাকবে না। সুতরাং, যদি জাভাস্ক্রিপ্ট কোডে waitForComplete() API চালানোর জন্য অনেক সমবর্তী অনুরোধ থাকে, তাহলে পরবর্তী অনুরোধগুলি একটি 500 অভ্যন্তরীণ সার্ভার ত্রুটি এবং 'টাইম আউট' ত্রুটি বার্তা দিয়ে জাভাস্ক্রিপ্ট নীতির সময় শেষ হওয়ার আগেই ব্যর্থ হবে।

সাধারণভাবে, এই দৃশ্যটি ঘটতে পারে যদি ব্যাকএন্ড অনুরোধগুলি প্রক্রিয়া করতে দীর্ঘ সময় নেয় বা উচ্চ ট্রাফিক থাকে।

প্রভাব

  1. API অনুরোধ 500 অভ্যন্তরীণ সার্ভার ত্রুটি এবং সঙ্গে ব্যর্থ হবে জাভাস্ক্রিপ্ট কোডে waitForComplete() নির্বাহ করা সমসাময়িক অনুরোধের সংখ্যা পূর্বনির্ধারিত সীমা অতিক্রম করলে ত্রুটি বার্তা 'টাইম আউট' সহ।
  2. সমস্যার কারণ নির্ণয় করা কঠিন হতে পারে কারণ নির্দিষ্ট জাভাস্ক্রিপ্ট নীতির সময়সীমা অতিবাহিত না হওয়া সত্ত্বেও জাভাস্ক্রিপ্ট 'টাইম আউট' ত্রুটির সাথে ব্যর্থ হয়৷

সর্বোত্তম অনুশীলন

কলআউট কোড স্ট্রীমলাইন করতে এবং কর্মক্ষমতা উন্নত করতে HTTP ক্লায়েন্টে কলব্যাক ব্যবহার করুন এবং JavaScript কোডে waitForComplete() ব্যবহার এড়ান। এই পদ্ধতি নিশ্চিত করে যে HTTP অনুরোধ সম্পূর্ণ না হওয়া পর্যন্ত জাভাস্ক্রিপ্ট চালানোর থ্রেড ব্লক করা হবে না।

যখন একটি কলব্যাক ব্যবহার করা হয়, থ্রেডটি JavaScript কোডে HTTP অনুরোধ পাঠায় এবং পুলে ফিরে আসে। কারণ থ্রেডটি আর অবরুদ্ধ নয়, এটি অন্যান্য অনুরোধগুলি পরিচালনা করার জন্য উপলব্ধ। HTTP অনুরোধটি সম্পূর্ণ হওয়ার পরে এবং কলব্যাক কার্যকর করার জন্য প্রস্তুত হওয়ার পরে, একটি টাস্ক তৈরি করা হবে এবং টাস্ক সারিতে যোগ করা হবে। পুল থেকে থ্রেডগুলির একটি কাজের অগ্রাধিকারের উপর ভিত্তি করে কলব্যাক কার্যকর করবে।

httpClient-এ কলব্যাক ব্যবহার করে জাভাস্ক্রিপ্ট কোডের নমুনা

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

আরও পড়া