কৌতূহল এবং পেশাদার বিকাশের সংযোগস্থলে ডেভেলপারদের জন্য তৈরি, এই প্রাইমারটির লক্ষ্য হল কীভাবে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং অ্যাপ্লিকেশন কর্মক্ষমতা, স্কেলেবিলিটি এবং প্রতিক্রিয়াশীলতা উন্নত করতে পারে তা আলোকিত করা। নন-ব্লকিং অপারেশন এবং ইভেন্ট লুপের সার্বজনীন নীতিগুলির উপর দৃষ্টি নিবদ্ধ করে, আমরা AsyncIO, Node.js, অথবা Go এর মতো নির্দিষ্ট প্রযুক্তির বাইরেও এগিয়ে যাই।
এই অনুসন্ধানটি এমন সফ্টওয়্যার ডেভেলপারদের জন্য তৈরি করা হয়েছে যারা প্রযুক্তিগত জটিলতা ছাড়াই আধুনিক সফ্টওয়্যার পরিচালনার দক্ষতা উপলব্ধি করতে আগ্রহী।
একবার ভাবুন তো, একটি ব্যস্ত শহরের একক থ্রেড হ্যান্ডলিং রিকোয়েস্ট কীভাবে একটি একক লেনের রাস্তার মতো: প্রতিটি রিকোয়েস্টই একটি গাড়ি, এবং যখন কেবল একটি লেন থাকে, তখন গাড়িগুলি লাইনে দাঁড়িয়ে থাকে, যার ফলে বিলম্ব হয়। কিন্তু কী হবে যদি আমাদের শহর - আমাদের পরিষেবা - আরও চতুরতার সাথে ট্র্যাফিক পরিচালনা করতে পারে? এখানেই একটি অ্যাসিঙ্ক্রোনাস রানটাইমের জাদু কাজ করে। এটি আমাদের শহরে একটি বুদ্ধিমান ট্র্যাফিক সিস্টেম যুক্ত করার মতো, অপেক্ষা না করেই একাধিক লেন এবং চৌরাস্তার মধ্য দিয়ে গাড়িগুলিকে পরিচালনা করে।
এই সিস্টেমটি ট্র্যাফিককে সুষ্ঠুভাবে প্রবাহিত রাখে, নিশ্চিত করে যে কোনও গাড়ি (বা কাজ) খুব বেশি সময় অপেক্ষা করতে না হয়, যা ঠিক এইভাবে একটি অ্যাসিঙ্ক্রোনাস রানটাইম আমাদের সফ্টওয়্যারকে দক্ষতার সাথে চালায়।
আসুন এমন একটি পরিষেবার উদাহরণ বিবেচনা করি যা I/O ক্রিয়াকলাপগুলি সিঙ্ক্রোনাসভাবে সম্পন্ন করে। স্পষ্টতার জন্য, এই ক্রিয়াকলাপগুলি চিত্রটিতে কার্যকরকরণের মূল প্রবাহের বাইরে দেখানো হয়েছে:
আপনার পরিষেবার স্টার্টআপ পর্যায়ে I/O ব্লক করা গ্রহণযোগ্য হতে পারে, তবে বহিরাগত অনুরোধগুলি প্রক্রিয়া করার সময় এই পদ্ধতিটি এড়িয়ে চলা যুক্তিসঙ্গত। নিম্নলিখিত চিত্রটি দেখায় যে কীভাবে নন-ব্লকিং I/O অপারেশন গ্রহণের মাধ্যমে পরিষেবার দক্ষতা বাড়ানো যেতে পারে:
এই উদাহরণগুলি এমন পরিস্থিতি তুলে ধরে যেখানে সার্ভারের কর্মক্ষমতা বৃদ্ধি সর্বাধিক করা হয়। তবুও, নন-ব্লকিং অপারেশনের সুবিধা যেকোনো ইনকামিং অনুরোধের ফ্রিকোয়েন্সিতেও বজায় থাকে। এমনকি আদর্শের চেয়ে কম পরিস্থিতিতেও, প্রক্রিয়াকরণ কর্মপ্রবাহে ডেডিকেটেড I/O থ্রেডগুলিকে একীভূত করার মাধ্যমে কর্মক্ষমতা লাভবান হয়।
একটি অনুরোধ প্রক্রিয়া করার জন্য প্রয়োজনীয় মোট সময় (ক্লায়েন্টের প্রাথমিক অনুরোধ থেকে চূড়ান্ত প্রতিক্রিয়া পর্যন্ত, যেমনটি ডানদিকে নীল নম্বর দ্বারা দেখানো হয়েছে) সর্বদা হ্রাস পাবে, যদি সমস্ত অনুরোধ পরিচালনা করার জন্য পর্যাপ্ত থ্রেড থাকে। সবচেয়ে খারাপ পরিস্থিতিতে, এই সময়কাল সিঙ্ক্রোনাস প্রক্রিয়াকরণ পদ্ধতির চেয়ে বেশি হবে না।
এরপর আমরা এমন একটি অভ্যাসের মুখোমুখি হই যা অনেক ডেভেলপারের কাছেই বিপরীত মনে হতে পারে। যখন I/O অপারেশনগুলি অনুরোধ প্রক্রিয়াকরণের সময়ের একটি উল্লেখযোগ্য অংশ হয়ে থাকে, তখন অন্যান্য কোড বিভাগগুলিকে অপ্টিমাইজ করার ফলে সামান্য উন্নতি হতে পারে। ক্যাশে থেকে ডেটা আনার সময়কাল ব্যবসায়িক যুক্তি এবং টেমপ্লেট রেন্ডারিংয়ের জন্য নিবেদিত সময়ের সাথে ঘনিষ্ঠভাবে সামঞ্জস্যপূর্ণ হতে পারে।
ক্যাশিং বা একটি ইন-প্রসেস ডাটাবেস ব্যবহার করলে অন্যান্য প্রক্রিয়াকরণ কার্যকলাপের তুলনায় ডেটা পুনরুদ্ধারের সময় কমতে পারে।
কোড কার্যকরভাবে ভাগ করার জন্য এবং কলব্যাক এক্সিকিউশন সহজতর করার জন্য, রানটাইমকে পরবর্তী ইভেন্ট লুপ চক্রে এগিয়ে যাওয়ার নির্দেশ দেওয়া যেতে পারে। এই ধারণাটি কীভাবে প্রয়োগ করা হয় তার একটি উদাহরণ নীচে দেওয়া হল:
// blocking callbacks function func1_cb(str, cb) { var res = func1(str); cb(res); } function func2_cb(str, cb) { var res = func2(str); cb(res); } // non-blocking callbacks function func1_cb(str, cb) { var res = func1(str); process.nextTick(function () { cb(res); }); } function func2_cb(str, cb) { var res = func2(str); process.nextTick(function () { cb(res); }); } // usage example func1_cb(content, function (str) { func2_cb(str, function (result) { // work with result }); });
গণনার দুটি অংশ বিভক্ত করার জন্য এই পদ্ধতিটি গ্রহণ করার মাধ্যমে, প্রায় একই সাথে অনুরোধ আগমনের পরিস্থিতিগুলির জন্য সামগ্রিক প্রক্রিয়াকরণের সময় একই থাকে। তবে, প্রথম অনুরোধের প্রতিক্রিয়া বিলম্বিত হয়:
"পরবর্তী টিক" কৌশল ব্যবহার করার সময় এই পরিস্থিতি সবচেয়ে কম অনুকূল ফলাফল উপস্থাপন করে। প্রাথমিক উদাহরণে যেমন দেখানো হয়েছে, "পরবর্তী টিক" পদ্ধতিটি বিরল অনুরোধের জন্য উপকারী প্রমাণিত হয়। যদি অনুরোধগুলি মাঝারি গতিতে আসে, তাহলে এই কৌশলটি ব্যবহার করে নতুন অনুরোধ শুরু করার এবং নন-ব্লকিং অপারেশন শুরু করার অনুমতি দিয়ে প্রক্রিয়াকরণের গতি বৃদ্ধি করা হয়। এই পদ্ধতিটি কার্যকরভাবে মোট প্রক্রিয়াকরণ সময় এবং প্রতি অনুরোধের গড় সময় উভয়ই হ্রাস করে:
উপসংহারে, অ্যাপ্লিকেশন কর্মক্ষমতা বৃদ্ধির জন্য নন-ব্লকিং I/O গ্রহণ অত্যন্ত গুরুত্বপূর্ণ এবং স্পার্স এবং ভারী ইনকামিং অনুরোধ ভলিউম উভয় পরিবেশেই উপকারী। উপরন্তু, কার্যকরভাবে কার্যকরকরণ প্রবাহকে সিকোয়েন্স করা — "পরবর্তী টিক" কৌশলের অনুরূপ ধারণা দ্বারা চিত্রিত — সার্ভারের দক্ষতা উল্লেখযোগ্যভাবে উন্নত করে। এই অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং অনুশীলনগুলি গ্রহণ করলে ঐতিহ্যবাহী, সিঙ্ক্রোনাস পদ্ধতির তুলনায় স্পষ্ট সুবিধা পাওয়া যায়।