বাংলা

জাভাস্ক্রিপ্টের অ্যাসিঙ্ক কনটেক্সট এবং রিকোয়েস্ট-স্কোপড ভেরিয়েবল কার্যকরভাবে পরিচালনা করার উপায় জানুন। অ্যাসিঙ্ক্রোনাস পরিবেশে কনটেক্সট বজায় রাখার জন্য AsyncLocalStorage, এর ব্যবহার, সেরা অনুশীলন এবং বিকল্পগুলো সম্পর্কে শিখুন।

জাভাস্ক্রিপ্ট অ্যাসিঙ্ক কনটেক্সট: রিকোয়েস্ট-স্কোপড ভেরিয়েবল পরিচালনা

অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং আধুনিক জাভাস্ক্রিপ্ট ডেভেলপমেন্টের একটি ভিত্তিপ্রস্তর, বিশেষত Node.js-এর মতো পরিবেশে যেখানে পারফরম্যান্সের জন্য নন-ব্লকিং I/O অপরিহার্য। তবে, অ্যাসিঙ্ক্রোনাস অপারেশন জুড়ে কনটেক্সট পরিচালনা করা চ্যালেঞ্জিং হতে পারে। এখানেই জাভাস্ক্রিপ্টের অ্যাসিঙ্ক কনটেক্সট, বিশেষ করে AsyncLocalStorage, কাজে আসে।

অ্যাসিঙ্ক কনটেক্সট কী?

অ্যাসিঙ্ক কনটেক্সট বলতে একটি অ্যাসিঙ্ক্রোনাস অপারেশনের সাথে ডেটা যুক্ত করার ক্ষমতা বোঝায় যা তার জীবনচক্র জুড়ে স্থায়ী থাকে। এটি এমন পরিস্থিতিতে অপরিহার্য যেখানে আপনাকে একাধিক অ্যাসিঙ্ক্রোনাস কল জুড়ে রিকোয়েস্ট-স্কোপড তথ্য (যেমন, ইউজার আইডি, রিকোয়েস্ট আইডি, ট্রেসিং তথ্য) বজায় রাখতে হবে। সঠিক কনটেক্সট ম্যানেজমেন্ট ছাড়া, ডিবাগিং, লগিং এবং নিরাপত্তা উল্লেখযোগ্যভাবে আরও কঠিন হয়ে উঠতে পারে।

অ্যাসিঙ্ক্রোনাস অপারেশনে কনটেক্সট বজায় রাখার চ্যালেঞ্জ

কনটেক্সট পরিচালনার প্রচলিত পদ্ধতি, যেমন ফাংশন কলের মাধ্যমে স্পষ্টভাবে ভেরিয়েবল পাস করা, অ্যাসিঙ্ক্রোনাস কোডের জটিলতা বাড়ার সাথে সাথে কষ্টকর এবং ত্রুটিপূর্ণ হয়ে উঠতে পারে। কলব্যাক হেল এবং প্রমিস চেইন কনটেক্সটের প্রবাহকে অস্পষ্ট করে তুলতে পারে, যা রক্ষণাবেক্ষণের সমস্যা এবং সম্ভাব্য নিরাপত্তা দুর্বলতার কারণ হতে পারে। এই সরলীকৃত উদাহরণটি বিবেচনা করুন:


function processRequest(req, res) {
  const userId = req.userId;

  fetchData(userId, (data) => {
    transformData(userId, data, (transformedData) => {
      logData(userId, transformedData, () => {
        res.send(transformedData);
      });
    });
  });
}

এই উদাহরণে, userId বারবার নেস্টেড কলব্যাকের মাধ্যমে পাস করা হচ্ছে। এই পদ্ধতিটি কেবল ভার্বোসই নয়, ফাংশনগুলোকে একে অপরের সাথে শক্তভাবে যুক্ত করে, যা তাদের পুনঃব্যবহারযোগ্যতা কমিয়ে দেয় এবং পরীক্ষা করা কঠিন করে তোলে।

AsyncLocalStorage-এর পরিচিতি

AsyncLocalStorage হলো Node.js-এর একটি বিল্ট-ইন মডিউল যা একটি নির্দিষ্ট অ্যাসিঙ্ক্রোনাস কনটেক্সটের জন্য স্থানীয় ডেটা সংরক্ষণের একটি ব্যবস্থা প্রদান করে। এটি আপনাকে এমন মান সেট এবং পুনরুদ্ধার করতে দেয় যা একই এক্সিকিউশন কনটেক্সটের মধ্যে অ্যাসিঙ্ক্রোনাস সীমানা জুড়ে স্বয়ংক্রিয়ভাবে প্রচারিত হয়। এটি রিকোয়েস্ট-স্কোপড ভেরিয়েবলের পরিচালনাকে উল্লেখযোগ্যভাবে সহজ করে।

AsyncLocalStorage কীভাবে কাজ করে

AsyncLocalStorage একটি স্টোরেজ কনটেক্সট তৈরি করে কাজ করে যা বর্তমান অ্যাসিঙ্ক্রোনাস অপারেশনের সাথে যুক্ত। যখন একটি নতুন অ্যাসিঙ্ক্রোনাস অপারেশন শুরু হয় (যেমন, একটি প্রমিস, একটি কলব্যাক), স্টোরেজ কনটেক্সটটি স্বয়ংক্রিয়ভাবে নতুন অপারেশনে প্রচারিত হয়। এটি নিশ্চিত করে যে অ্যাসিঙ্ক্রোনাস কলের পুরো চেইন জুড়ে একই ডেটা অ্যাক্সেসযোগ্য থাকে।

AsyncLocalStorage-এর প্রাথমিক ব্যবহার

এখানে AsyncLocalStorage কীভাবে ব্যবহার করতে হয় তার একটি প্রাথমিক উদাহরণ দেওয়া হলো:


const { AsyncLocalStorage } = require('async_hooks');

const asyncLocalStorage = new AsyncLocalStorage();

function processRequest(req, res) {
  const userId = req.userId;

  asyncLocalStorage.run(new Map(), () => {
    asyncLocalStorage.getStore().set('userId', userId);

    fetchData().then(data => {
      return transformData(data);
    }).then(transformedData => {
      return logData(transformedData);
    }).then(() => {
      res.send(transformedData);
    });
  });
}

async function fetchData() {
  const userId = asyncLocalStorage.getStore().get('userId');
  // ... userId ব্যবহার করে ডেটা আনুন
  return data;
}

async function transformData(data) {
  const userId = asyncLocalStorage.getStore().get('userId');
  // ... userId ব্যবহার করে ডেটা রূপান্তর করুন
  return transformedData;
}

async function logData(data) {
  const userId = asyncLocalStorage.getStore().get('userId');
  // ... userId ব্যবহার করে ডেটা লগ করুন
  return;
}

এই উদাহরণে:

AsyncLocalStorage-এর ব্যবহারের ক্ষেত্র

AsyncLocalStorage নিম্নলিখিত পরিস্থিতিতে বিশেষভাবে কার্যকর:

১. রিকোয়েস্ট ট্রেসিং

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

২. লগিং কনটেক্সট

ইভেন্ট লগ করার সময়, প্রায়শই প্রাসঙ্গিক তথ্য যেমন ইউজার আইডি, রিকোয়েস্ট আইডি বা সেশন আইডি অন্তর্ভুক্ত করা সহায়ক হয়। AsyncLocalStorage এই তথ্যটি লগ বার্তাগুলিতে স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করতে ব্যবহার করা যেতে পারে, যা সমস্যা ডিবাগ এবং বিশ্লেষণ করা সহজ করে তোলে। এমন একটি পরিস্থিতি কল্পনা করুন যেখানে আপনাকে আপনার অ্যাপ্লিকেশনের মধ্যে ব্যবহারকারীর কার্যকলাপ ট্র্যাক করতে হবে। AsyncLocalStorage-এ ইউজার আইডি সংরক্ষণ করে, আপনি স্বয়ংক্রিয়ভাবে সেই ব্যবহারকারীর সেশনের সাথে সম্পর্কিত সমস্ত লগ বার্তাগুলিতে এটি অন্তর্ভুক্ত করতে পারেন, যা তাদের আচরণ এবং তারা যে সম্ভাব্য সমস্যার সম্মুখীন হতে পারে সে সম্পর্কে মূল্যবান অন্তর্দৃষ্টি প্রদান করে।

৩. প্রমাণীকরণ এবং অনুমোদন

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

৪. ডেটাবেস লেনদেন

ডেটাবেসের সাথে কাজ করার সময়, প্রায়শই একাধিক অ্যাসিঙ্ক্রোনাস অপারেশন জুড়ে লেনদেন পরিচালনা করা প্রয়োজন। AsyncLocalStorage ডেটাবেস সংযোগ বা লেনদেন অবজেক্ট সংরক্ষণ করতে ব্যবহার করা যেতে পারে, এটি নিশ্চিত করে যে একই রিকোয়েস্টের মধ্যে সমস্ত অপারেশন একই লেনদেনের মধ্যে কার্যকর হয়। উদাহরণস্বরূপ, যদি একজন ব্যবহারকারী একটি অর্ডার দেন, তাহলে আপনাকে একাধিক টেবিল (যেমন, orders, order_items, inventory) আপডেট করতে হতে পারে। AsyncLocalStorage-এ ডেটাবেস লেনদেন অবজেক্ট সংরক্ষণ করে, আপনি নিশ্চিত করতে পারেন যে এই সমস্ত আপডেট একটি একক লেনদেনের মধ্যে সঞ্চালিত হয়, যা অ্যাটোমিসিটি এবং সামঞ্জস্যতা নিশ্চিত করে।

৫. মাল্টি-টেন্যান্সি

মাল্টি-টেন্যান্ট অ্যাপ্লিকেশনগুলিতে, প্রতিটি টেন্যান্টের জন্য ডেটা এবং রিসোর্স বিচ্ছিন্ন করা অপরিহার্য। AsyncLocalStorage টেন্যান্ট আইডি সংরক্ষণ করতে ব্যবহার করা যেতে পারে, যা আপনাকে বর্তমান টেন্যান্টের উপর ভিত্তি করে গতিশীলভাবে রিকোয়েস্টগুলোকে উপযুক্ত ডেটা স্টোর বা রিসোর্সে রুট করতে দেয়। একটি SaaS প্ল্যাটফর্ম কল্পনা করুন যেখানে একাধিক সংস্থা একই অ্যাপ্লিকেশন ইনস্ট্যান্স ব্যবহার করে। AsyncLocalStorage-এ টেন্যান্ট আইডি সংরক্ষণ করে, আপনি নিশ্চিত করতে পারেন যে প্রতিটি সংস্থার ডেটা আলাদা রাখা হয়েছে এবং তারা শুধুমাত্র তাদের নিজস্ব রিসোর্স অ্যাক্সেস করতে পারে।

AsyncLocalStorage ব্যবহারের সেরা অনুশীলন

যদিও AsyncLocalStorage একটি শক্তিশালী টুল, সম্ভাব্য পারফরম্যান্স সমস্যা এড়াতে এবং কোডের স্বচ্ছতা বজায় রাখতে এটি বিচক্ষণতার সাথে ব্যবহার করা গুরুত্বপূর্ণ। এখানে কিছু সেরা অনুশীলন মনে রাখা উচিত:

১. ডেটা স্টোরেজ ন্যূনতম করুন

AsyncLocalStorage-এ শুধুমাত্র সেই ডেটা সংরক্ষণ করুন যা একেবারে প্রয়োজনীয়। প্রচুর পরিমাণে ডেটা সংরক্ষণ করা পারফরম্যান্সকে প্রভাবিত করতে পারে, বিশেষ করে উচ্চ-কনকারেন্সি পরিবেশে। উদাহরণস্বরূপ, সম্পূর্ণ ব্যবহারকারী অবজেক্ট সংরক্ষণ করার পরিবর্তে, শুধুমাত্র ব্যবহারকারী আইডি সংরক্ষণ করার কথা বিবেচনা করুন এবং প্রয়োজনে ক্যাশে বা ডেটাবেস থেকে ব্যবহারকারী অবজেক্টটি পুনরুদ্ধার করুন।

২. অতিরিক্ত কনটেক্সট সুইচিং এড়িয়ে চলুন

ঘন ঘন কনটেক্সট সুইচিংও পারফরম্যান্সকে প্রভাবিত করতে পারে। AsyncLocalStorage থেকে মান সেট এবং পুনরুদ্ধার করার সংখ্যা ন্যূনতম করুন। স্টোরেজ কনটেক্সট অ্যাক্সেস করার ওভারহেড কমাতে ফাংশনের মধ্যে প্রায়শই অ্যাক্সেস করা মানগুলো স্থানীয়ভাবে ক্যাশে করুন। উদাহরণস্বরূপ, যদি আপনাকে একটি ফাংশনের মধ্যে একাধিকবার ব্যবহারকারী আইডি অ্যাক্সেস করতে হয়, তবে এটি একবার AsyncLocalStorage থেকে পুনরুদ্ধার করুন এবং পরবর্তী ব্যবহারের জন্য একটি স্থানীয় ভেরিয়েবলে সংরক্ষণ করুন।

৩. পরিষ্কার এবং সামঞ্জস্যপূর্ণ নামকরণের নিয়ম ব্যবহার করুন

AsyncLocalStorage-এ আপনি যে কীগুলো সংরক্ষণ করেন তার জন্য পরিষ্কার এবং সামঞ্জস্যপূর্ণ নামকরণের নিয়ম ব্যবহার করুন। এটি কোডের পঠনযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করবে। উদাহরণস্বরূপ, একটি নির্দিষ্ট বৈশিষ্ট্য বা ডোমেনের সাথে সম্পর্কিত সমস্ত কী-এর জন্য একটি সামঞ্জস্যপূর্ণ উপসর্গ ব্যবহার করুন, যেমন request.id বা user.id

৪. ব্যবহারের পর পরিষ্কার করুন

যদিও অ্যাসিঙ্ক্রোনাস অপারেশন শেষ হলে AsyncLocalStorage স্বয়ংক্রিয়ভাবে স্টোরেজ কনটেক্সট পরিষ্কার করে, তবে যখন আর প্রয়োজন নেই তখন স্টোরেজ কনটেক্সটটি স্পষ্টভাবে পরিষ্কার করা একটি ভাল অভ্যাস। এটি মেমরি লিক প্রতিরোধ করতে এবং পারফরম্যান্স উন্নত করতে সাহায্য করতে পারে। আপনি exit মেথড ব্যবহার করে স্পষ্টভাবে কনটেক্সট পরিষ্কার করতে পারেন।

৫. পারফরম্যান্সের প্রভাব বিবেচনা করুন

AsyncLocalStorage ব্যবহারের পারফরম্যান্সের প্রভাব সম্পর্কে সচেতন থাকুন, বিশেষ করে উচ্চ-কনকারেন্সি পরিবেশে। আপনার কোড আপনার পারফরম্যান্সের প্রয়োজনীয়তা পূরণ করে কিনা তা নিশ্চিত করতে বেঞ্চমার্ক করুন। কনটেক্সট ম্যানেজমেন্ট সম্পর্কিত সম্ভাব্য বাধা শনাক্ত করতে আপনার অ্যাপ্লিকেশন প্রোফাইল করুন। যদি AsyncLocalStorage অগ্রহণযোগ্য পারফরম্যান্স ওভারহেড তৈরি করে তবে বিকল্প পদ্ধতি, যেমন স্পষ্ট কনটেক্সট পাসিং, বিবেচনা করুন।

৬. লাইব্রেরিতে সতর্কতার সাথে ব্যবহার করুন

সাধারণ ব্যবহারের জন্য তৈরি লাইব্রেরিতে সরাসরি AsyncLocalStorage ব্যবহার করা থেকে বিরত থাকুন। লাইব্রেরিগুলোকে তারা কোন কনটেক্সটে ব্যবহৃত হচ্ছে সে সম্পর্কে অনুমান করা উচিত নয়। পরিবর্তে, ব্যবহারকারীদের জন্য স্পষ্টভাবে প্রাসঙ্গিক তথ্য পাস করার বিকল্প সরবরাহ করুন। এটি ব্যবহারকারীদের তাদের অ্যাপ্লিকেশনগুলিতে কনটেক্সট কীভাবে পরিচালিত হয় তা নিয়ন্ত্রণ করতে দেয় এবং সম্ভাব্য দ্বন্দ্ব বা অপ্রত্যাশিত আচরণ এড়িয়ে চলে।

AsyncLocalStorage-এর বিকল্প

যদিও AsyncLocalStorage একটি সুবিধাজনক এবং শক্তিশালী টুল, এটি সবসময় প্রতিটি পরিস্থিতির জন্য সেরা সমাধান নয়। এখানে কিছু বিকল্প বিবেচনা করার মতো:

১. স্পষ্ট কনটেক্সট পাসিং

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

২. কনটেক্সট অবজেক্ট

আলাদা আলাদা ভেরিয়েবল পাস করার পরিবর্তে, আপনি একটি কনটেক্সট অবজেক্ট তৈরি করতে পারেন যা সমস্ত প্রাসঙ্গিক তথ্যকে অন্তর্ভুক্ত করে। এটি ফাংশন সিগনেচারকে সহজ করতে পারে এবং কোডকে আরও পঠনযোগ্য করে তুলতে পারে। কনটেক্সট অবজেক্টগুলো স্পষ্ট কনটেক্সট পাসিং এবং AsyncLocalStorage-এর মধ্যে একটি ভাল আপস। তারা সম্পর্কিত প্রাসঙ্গিক তথ্যগুলোকে একসাথে গ্রুপ করার একটি উপায় সরবরাহ করে, যা কোডকে আরও সংগঠিত এবং বোঝা সহজ করে তোলে। তবে, তাদের এখনও প্রতিটি ফাংশনে কনটেক্সট অবজেক্টটি স্পষ্টভাবে পাস করার প্রয়োজন হয়।

৩. অ্যাসিঙ্ক হুকস (ডায়াগনস্টিকসের জন্য)

Node.js-এর async_hooks মডিউল অ্যাসিঙ্ক্রোনাস অপারেশন ট্র্যাক করার জন্য একটি আরও সাধারণ ব্যবস্থা সরবরাহ করে। যদিও এটি AsyncLocalStorage-এর চেয়ে ব্যবহার করা আরও জটিল, এটি আরও বেশি নমনীয়তা এবং নিয়ন্ত্রণ সরবরাহ করে। async_hooks মূলত ডায়াগনস্টিকস এবং ডিবাগিংয়ের উদ্দেশ্যে তৈরি। এটি আপনাকে অ্যাসিঙ্ক্রোনাস অপারেশনগুলোর জীবনচক্র ট্র্যাক করতে এবং তাদের এক্সিকিউশন সম্পর্কে তথ্য সংগ্রহ করতে দেয়। তবে, এর সম্ভাব্য পারফরম্যান্স ওভারহেডের কারণে এটি সাধারণ-উদ্দেশ্য কনটেক্সট ম্যানেজমেন্টের জন্য সুপারিশ করা হয় না।

৪. ডায়াগনস্টিক কনটেক্সট (OpenTelemetry)

OpenTelemetry ট্রেস, মেট্রিক্স এবং লগ সহ টেলিমেট্রি ডেটা সংগ্রহ এবং রপ্তানি করার জন্য একটি মানসম্মত API সরবরাহ করে। এর ডায়াগনস্টিক কনটেক্সট বৈশিষ্ট্যগুলো ডিস্ট্রিবিউটেড সিস্টেমে কনটেক্সট প্রচার পরিচালনার জন্য একটি উন্নত এবং শক্তিশালী সমাধান সরবরাহ করে। OpenTelemetry-এর সাথে একীভূত হওয়া বিভিন্ন সার্ভিস এবং প্ল্যাটফর্ম জুড়ে কনটেক্সট সামঞ্জস্যতা নিশ্চিত করার একটি ভেন্ডর-নিরপেক্ষ উপায় সরবরাহ করে। এটি জটিল মাইক্রোসার্ভিস আর্কিটেকচারে বিশেষভাবে কার্যকর যেখানে কনটেক্সটকে সার্ভিস সীমানা জুড়ে প্রচার করতে হয়।

বাস্তব-জগতের উদাহরণ

আসুন কিছু বাস্তব-জগতের উদাহরণ দেখি যেখানে AsyncLocalStorage বিভিন্ন পরিস্থিতিতে ব্যবহার করা যেতে পারে।

১. ই-কমার্স অ্যাপ্লিকেশন: রিকোয়েস্ট ট্রেসিং

একটি ই-কমার্স অ্যাপ্লিকেশনে, আপনি ব্যবহারকারীর রিকোয়েস্টগুলো একাধিক সার্ভিস, যেমন প্রোডাক্ট ক্যাটালগ, শপিং কার্ট এবং পেমেন্ট গেটওয়ে জুড়ে ট্র্যাক করতে AsyncLocalStorage ব্যবহার করতে পারেন। এটি আপনাকে প্রতিটি সার্ভিসের পারফরম্যান্স নিরীক্ষণ করতে এবং ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করতে পারে এমন বাধা শনাক্ত করতে দেয়।


// API গেটওয়েতে
const { AsyncLocalStorage } = require('async_hooks');
const { v4: uuidv4 } = require('uuid');

const asyncLocalStorage = new AsyncLocalStorage();

app.use((req, res, next) => {
  const requestId = uuidv4();
  asyncLocalStorage.run(new Map(), () => {
    asyncLocalStorage.getStore().set('requestId', requestId);
    res.setHeader('X-Request-Id', requestId);
    next();
  });
});

// প্রোডাক্ট ক্যাটালগ সার্ভিসে
async function getProductDetails(productId) {
  const requestId = asyncLocalStorage.getStore().get('requestId');
  // অন্যান্য বিবরণের সাথে রিকোয়েস্ট আইডি লগ করুন
  logger.info(`[${requestId}] প্রোডাক্ট আইডির জন্য প্রোডাক্টের বিবরণ আনা হচ্ছে: ${productId}`);
  // ... প্রোডাক্টের বিবরণ আনুন
}

২. SaaS প্ল্যাটফর্ম: মাল্টি-টেন্যান্সি

একটি SaaS প্ল্যাটফর্মে, আপনি টেন্যান্ট আইডি সংরক্ষণ করতে এবং বর্তমান টেন্যান্টের উপর ভিত্তি করে গতিশীলভাবে রিকোয়েস্টগুলোকে উপযুক্ত ডেটা স্টোর বা রিসোর্সে রুট করতে AsyncLocalStorage ব্যবহার করতে পারেন। এটি নিশ্চিত করে যে প্রতিটি টেন্যান্টের ডেটা আলাদা রাখা হয়েছে এবং তারা শুধুমাত্র তাদের নিজস্ব রিসোর্স অ্যাক্সেস করতে পারে।


// রিকোয়েস্ট থেকে টেন্যান্ট আইডি বের করার জন্য মিডলওয়্যার
app.use((req, res, next) => {
  const tenantId = req.headers['x-tenant-id'];
  asyncLocalStorage.run(new Map(), () => {
    asyncLocalStorage.getStore().set('tenantId', tenantId);
    next();
  });
});

// একটি নির্দিষ্ট টেন্যান্টের জন্য ডেটা আনার ফাংশন
async function fetchData(query) {
  const tenantId = asyncLocalStorage.getStore().get('tenantId');
  const db = getDatabaseConnection(tenantId);
  return db.query(query);
}

৩. মাইক্রোসার্ভিসেস আর্কিটেকচার: লগিং কনটেক্সট

একটি মাইক্রোসার্ভিসেস আর্কিটেকচারে, আপনি ইউজার আইডি সংরক্ষণ করতে এবং বিভিন্ন সার্ভিস থেকে লগ বার্তাগুলিতে এটি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করতে AsyncLocalStorage ব্যবহার করতে পারেন। এটি একটি নির্দিষ্ট ব্যবহারকারীকে প্রভাবিত করতে পারে এমন সমস্যা ডিবাগ এবং বিশ্লেষণ করা সহজ করে তোলে।


// প্রমাণীকরণ সার্ভিসে
app.use((req, res, next) => {
  const userId = req.user.id;
  asyncLocalStorage.run(new Map(), () => {
    asyncLocalStorage.getStore().set('userId', userId);
    next();
  });
});

// ডেটা প্রসেসিং সার্ভিসে
async function processData(data) {
  const userId = asyncLocalStorage.getStore().get('userId');
  logger.info(`[ইউজার আইডি: ${userId}] ডেটা প্রসেস করা হচ্ছে: ${JSON.stringify(data)}`);
  // ... ডেটা প্রসেস করুন
}

উপসংহার

AsyncLocalStorage অ্যাসিঙ্ক্রোনাস জাভাস্ক্রিপ্ট পরিবেশে রিকোয়েস্ট-স্কোপড ভেরিয়েবল পরিচালনার জন্য একটি মূল্যবান টুল। এটি অ্যাসিঙ্ক্রোনাস অপারেশন জুড়ে কনটেক্সটের পরিচালনাকে সহজ করে, কোডকে আরও পঠনযোগ্য, রক্ষণাবেক্ষণযোগ্য এবং সুরক্ষিত করে তোলে। এর ব্যবহারের ক্ষেত্র, সেরা অনুশীলন এবং বিকল্পগুলো বোঝার মাধ্যমে, আপনি শক্তিশালী এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করতে কার্যকরভাবে AsyncLocalStorage ব্যবহার করতে পারেন। তবে, এর পারফরম্যান্সের প্রভাব সাবধানে বিবেচনা করা এবং সম্ভাব্য সমস্যা এড়াতে এটি বিচক্ষণতার সাথে ব্যবহার করা অপরিহার্য। আপনার অ্যাসিঙ্ক্রোনাস জাভাস্ক্রিপ্ট ডেভেলপমেন্ট অনুশীলন উন্নত করতে চিন্তাভাবনা করে AsyncLocalStorage গ্রহণ করুন।

পরিষ্কার উদাহরণ, ব্যবহারিক পরামর্শ এবং একটি ব্যাপক পর্যালোচনার মাধ্যমে, এই নির্দেশিকাটি বিশ্বজুড়ে ডেভেলপারদের তাদের জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলিতে AsyncLocalStorage ব্যবহার করে অ্যাসিঙ্ক কনটেক্সট কার্যকরভাবে পরিচালনা করার জ্ঞান দিয়ে সজ্জিত করার লক্ষ্য রাখে। আপনার নির্দিষ্ট প্রয়োজনের জন্য সেরা সমাধান নিশ্চিত করতে পারফরম্যান্সের প্রভাব এবং বিকল্পগুলো বিবেচনা করতে মনে রাখবেন।