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

আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন
.info- তে যান।

Apigee Edge-এর জাভাস্ক্রিপ্ট পলিসি আপনাকে কাস্টম কোড যোগ করার সুযোগ দেয়, যা একটি এপিআই প্রক্সি ফ্লো-এর প্রেক্ষাপটে কার্যকর হয়। উদাহরণস্বরূপ, জাভাস্ক্রিপ্ট পলিসিতে থাকা কাস্টম কোডটি নিম্নলিখিত কাজগুলোর জন্য ব্যবহার করা যেতে পারে:

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

HTTP ক্লায়েন্ট

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

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

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

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

অ্যান্টিপ্যাটার্ন

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

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

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

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

প্রভাব

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

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

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

যখন একটি কলব্যাক ব্যবহার করা হয়, তখন থ্রেডটি জাভাস্ক্রিপ্ট কোডে 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);

আরও পড়ুন