Node.js എങ്ങനെ ആയിരക്കണക്കിന് റിക്വസ്റ്റുകൾ കൈകാര്യം ചെയ്യുന്നു
Node.js ഒരു സിംഗിൾ-ത്രെഡഡ് (single-threaded) ആണെന്ന് ആളുകൾ പറയാറുണ്ട്.
എന്നിരുന്നാലും, ഇത് തടസ്സമില്ലാതെ ആയിരക്കണക്കിന് റിക്വസ്റ്റുകൾ കൈകാര്യം ചെയ്യുകയും, ഫയലുകൾ വായിക്കുകയും, API കോളുകൾ നടത്തുകയും ചെയ്യുന്നു.
ഇത് എങ്ങനെയാണ് പ്രവർത്തിക്കുന്നത്?
ഇതിനുള്ള ഉത്തരം libuv ആണ്.
libuv ഒരു C ലൈബ്രറിയാണ്. ഇത് Node.js-ന് അസിൻക്രണസ് (asynchronous), നോൺ-ബ്ലോക്കിംഗ് (non-blocking) I/O ശേഷികൾ നൽകുന്നു. JavaScript-ന് സ്വയം ഫയലുകൾ വായിക്കാനോ നെറ്റ്വർക്ക് സോക്കറ്റുകൾ നിയന്ത്രിക്കാനോ കഴിയില്ല. നിങ്ങളുടെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റവുമായി ആശയവിനിമയം നടത്താൻ Node.js libuv ഉപയോഗിക്കുന്നു.
libuv ഇല്ലെങ്കിൽ, ഓരോ തവണ ഫയൽ വായിക്കുമ്പോഴും JavaScript പ്രവർത്തനം നിർത്തിനിൽക്കും. നിങ്ങളുടെ ആപ്പ് റെസ്പോൺസീവ് അല്ലാതാകും (unresponsive).
libuv ഉള്ളതുകൊണ്ട്, ഫയൽ റീഡിംഗ് ബാക്ക്ഗ്രൗണ്ടിൽ നടക്കുന്നു. JavaScript മറ്റ് കോഡുകൾ പ്രവർത്തിപ്പിച്ചു കൊണ്ടിരിക്കുന്നു.
ഉദാഹരണം:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
ഔട്ട്പുട്ട്: Start End (ഫയലിലെ ഉള്ളടക്കം)
ഫയൽ റീഡിംഗ് പൂർത്തിയാകുന്നതിന് മുമ്പ് തന്നെ Node.js "End" എന്ന് പ്രിന്റ് ചെയ്യുന്നു. അത് കാത്തുനിൽക്കുന്നില്ല.
libuv നിങ്ങളുടെ കോഡിനെ എങ്ങനെ നിയന്ത്രിക്കുന്നു:
• The Event Loop: ടാസ്ക്കുകൾ പൂർത്തിയായോ എന്ന് പരിശോധിക്കുന്ന ലൂപ്പ് പ്രവർത്തിപ്പിക്കുന്നത് libuv ആണ്. ടാസ്ക്കുകൾ പൂർത്തിയാകുമ്പോൾ ഇത് callback-കളെ ഒരു ക്യൂവിൽ (queue) ഇടുന്നു. • Thread Pool: JavaScript ഒരു ത്രെഡ് മാത്രമാണ് ഉപയോഗിക്കുന്നത്. എന്നാൽ libuv ഒരു കൂട്ടം വർക്കർ ത്രെഡുകൾ (worker threads) ഉപയോഗിക്കുന്നു. ഡിഫോൾട്ട് ആയി ഈ പൂളിൽ 4 ത്രെഡുകൾ ഉണ്ടാകും. ഈ ത്രെഡുകൾ താഴെ പറയുന്ന ഭാരമേറിയ ജോലികൾ കൈകാര്യം ചെയ്യുന്നു:
- File system operations
- DNS lookups
- Compression
- Cryptography
• Networking: libuv, HTTP, TCP, UDP സോക്കറ്റുകൾ നിയന്ത്രിക്കുന്നു. ഇത് ഒരേസമയം നിരവധി കണക്ഷനുകൾ കൈകാര്യം ചെയ്യാൻ സെർവറുകളെ അനുവദിക്കുന്നു.
• Timers: libuv,
setTimeout,setIntervalഎന്നിവ കൈകാര്യം ചെയ്യുന്നു.
എക്സിക്യൂഷൻ ഫ്ലോ (execution flow) ഇപ്രകാരമാണ് പ്രവർത്തിക്കുന്നത്:
- JavaScript നിങ്ങളുടെ കോഡ് പ്രവർത്തിപ്പിക്കുന്നു.
- libuv ഭാരമേറിയ ജോലികളെ ബാക്ക്ഗ്രൗണ്ടിലേക്ക് മാറ്റുന്നു.
- JavaScript അടുത്ത വരിയിലേക്ക് നീങ്ങുന്നു.
- ടാസ്ക് പൂർത്തിയാകുമ്പോൾ libuv Event Loop-നെ അറിയിക്കുന്നു.
- Event Loop നിങ്ങളുടെ callback പ്രവർത്തിപ്പിക്കുന്നു.
ഒരു പിസ്സ ഷോപ്പിനെക്കുറിച്ച് ചിന്തിക്കുക.
libuv ഇല്ലെങ്കിൽ, നിങ്ങൾ കൗണ്ടറിൽ നിന്ന് ഓരോ പത്ത് സെക്കൻഡിലും "എന്റെ ഭക്ഷണം തയ്യാറായോ?" എന്ന് ചോദിച്ചു നിൽക്കും. നിങ്ങൾ വരി തടസ്സപ്പെടുത്തുന്നു.
libuv ഉള്ളപ്പോൾ, നിങ്ങൾ ഓർഡർ നൽകി അവിടെ ഇരിക്കുന്നു, ഒരു നോട്ടിഫിക്കേഷനായി കാത്തിരിക്കുന്നു. പിസ്സ തയ്യാറാകുന്നത് വരെ നിങ്ങൾക്ക് മറ്റ് കാര്യങ്ങൾ ചെയ്യാൻ സാധിക്കും.
സംഗ്രഹം:
• JavaScript execution: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv
Node.js വേഗത്തിൽ പ്രവർത്തിപ്പിക്കാൻ സഹായിക്കുന്ന എൻജിനാണ് libuv.
