
## নন-ব্লকিং I/O কি?
নন-ব্লকিং I/O হলো এমন একটি প্রক্রিয়া যা অ্যাপ্লিকেশনকে কোনো I/O অপারেশনের জন্য অপেক্ষা না করে কাজ চালিয়ে যেতে দেয়। সাধারণত, কোনো I/O (ইনপুট/আউটপুট) অপারেশন যেমন ফাইল পড়া, ডাটাবেস থেকে ডেটা আনা, বা API কল করার জন্য অপেক্ষা করতে হয়। কিন্তু নন-ব্লকিং I/O পদ্ধতিতে এসব অপারেশনের জন্য অপেক্ষা করার পরিবর্তে, কাজটি ব্যাকগ্রাউন্ডে সম্পন্ন হয় এবং যখন কাজটি সম্পন্ন হয় তখন একটি callback বা event-driven পদ্ধতির মাধ্যমে ফলাফল পাওয়া যায়।
## Node.js-এ নন-ব্লকিং I/O
Node.js হলো একটি event-driven, non-blocking I/O মডেল ব্যবহারকারী জাভাস্ক্রিপ্ট রানটাইম। এখানে সব I/O অপারেশন (যেমন ডাটাবেস অ্যাক্সেস, ফাইল সিস্টেম অ্যাক্সেস, নেটওয়ার্ক অনুরোধ) নন-ব্লকিং পদ্ধতিতে কাজ করে। এর মানে হলো, Node.js কোনো I/O কাজ শুরু করার পর, অন্য কাজ সম্পাদন করতে থাকে এবং I/O কাজ সম্পন্ন হলে নির্দিষ্ট callback বা promise দিয়ে সে কাজের রেসপন্স পায়।
উদাহরণ:
const fs = require('fs');
// একটি ফাইল পড়া - নন-ব্লকিং পদ্ধতি
fs.readFile('test.txt', 'utf-8', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log('File content:', data);
});
console.log('This will run first, before file reading is complete.');
এই উদাহরণে, `fs.readFile()` ফাংশনটি নন-ব্লকিং পদ্ধতিতে কাজ করে। ফাইল পড়ার কাজটি শুরু হয়, কিন্তু Node.js ফাইলটি পুরোপুরি পড়া শেষ হওয়ার আগেই `console.log('This will run first')` মেসেজটি প্রদর্শন করে। যখন ফাইলটি পড়া শেষ হয়, তখন callback ফাংশনটি চালু হয় এবং ফাইলের কন্টেন্ট প্রিন্ট হয়।
## নন-ব্লকিং I/O এর সুবিধা
১. উচ্চ কর্মদক্ষতা: নন-ব্লকিং I/O এর মাধ্যমে Node.js একই সাথে একাধিক কাজ সম্পন্ন করতে পারে, যার ফলে সার্ভারের পারফরমেন্স বৃদ্ধি পায়।
২. স্কেলেবিলিটি: নন-ব্লকিং I/O-এর ফলে অল্প রিসোর্স ব্যবহার করে অনেক বেশি রিকোয়েস্ট হ্যান্ডেল করা সম্ভব।
৩. কম্পিউটেশনাল ওভারহেড কমানো: I/O কাজগুলো ব্যাকগ্রাউন্ডে চলতে থাকলে, CPU অন্যান্য কাজ করতে পারে, ফলে সার্ভারের লোড কম হয়।
## ইভেন্ট লুপ এবং কলব্যাক
Node.js-এর মূলমন্ত্র হলো এর ইভেন্ট লুপ। ইভেন্ট লুপ সার্ভারকে নন-ব্লকিং পদ্ধতিতে কাজ করতে দেয়। যখন একটি I/O কাজ শুরু হয়, তা ইভেন্ট লুপে অপেক্ষা করে। কাজটি শেষ হলে ইভেন্ট লুপ callback ফাংশনকে ডাকে এবং মূল প্রোগ্রাম আবার চালু হয়।
### ইভেন্ট লুপের ধাপগুলো:
১. Timers: এখানে `setTimeout` এবং `setInterval` এর মতো টাইমার ফাংশনগুলো কাজ করে।
২. Pending Callbacks: পেন্ডিং কলে থাকা কলব্যাকগুলো এখানে সম্পন্ন হয়।
৩. Poll: I/O কাজগুলো এখানে থাকে, যতক্ষণ না সেগুলো সম্পন্ন হয়।
৪. Check:`setImmediate()` দ্বারা ডাকা কলব্যাকগুলো এখানে কাজ করে।
Node.js এর নন-ব্লকিং I/O মডেল এটি অ্যাসিঙ্ক্রোনাস পদ্ধতিতে উচ্চ কার্যক্ষমতা এবং স্কেলেবিলিটি নিশ্চিত করে। এই মডেল অ্যাপ্লিকেশনকে একাধিক কাজ সমান্তরালে চালানোর সুযোগ দেয়, ফলে সার্ভারের লোড কমে এবং দ্রুত ফলাফল পাওয়া যায়।
