Node.js ಸಾವಿರಾರು Requests ಅನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುತ್ತದೆ
Node.js ಸಿಂಗಲ್-ಥ್ರೆಡೆಡ್ (single-threaded) ಎಂದು ಜನರು ಹೇಳುತ್ತಾರೆ.
ಆದರೂ, ಇದು ನಿಲ್ಲದೆ ಸಾವಿರಾರು ವಿನಂತಿಗಳನ್ನು (requests) ನಿರ್ವಹಿಸುತ್ತದೆ, ಫೈಲ್ಗಳನ್ನು ಓದುತ್ತದೆ ಮತ್ತು API ಕರೆಗಳನ್ನು ಮಾಡುತ್ತದೆ.
ಇದು ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ?
ಇದಕ್ಕೆ ಉತ್ತರ libuv.
libuv ಒಂದು C ಲೈಬ್ರರಿ. ಇದು Node.js ಗೆ asynchronous ಮತ್ತು non-blocking I/O ಸಾಮರ್ಥ್ಯಗಳನ್ನು ನೀಡುತ್ತದೆ. JavaScript ತನ್ನಷ್ಟಕ್ಕೆ ತಾನೇ ಫೈಲ್ಗಳನ್ನು ಓದಲು ಅಥವಾ ನೆಟ್ವರ್ಕ್ ಸಾಕೆಟ್ಗಳನ್ನು (network sockets) ನಿರ್ವಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. Node.js ನಿಮ್ಮ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಜೊತೆ ಸಂವಹನ ನಡೆಸಲು libuv ಅನ್ನು ಬಳಸುತ್ತದೆ.
libuv ಇಲ್ಲದಿದ್ದರೆ, ನೀವು ಪ್ರತಿ ಬಾರಿ ಫೈಲ್ ಓದಿದಾಗಲೂ JavaScript ನಿಂತುಹೋಗುತ್ತದೆ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸದಂತಾಗುತ್ತದೆ (unresponsive).
libuv ಇದ್ದರೆ, ಫೈಲ್ ಓದುವ ಪ್ರಕ್ರಿಯೆಯು ಹಿನ್ನೆಲೆಯಲ್ಲಿ (background) ನಡೆಯುತ್ತದೆ. JavaScript ಇತರ ಕೋಡ್ಗಳನ್ನು ಚಲಾಯಿಸುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತದೆ.
Example:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => { console.log(data); });
console.log("End");
Output: Start End (ಫೈಲ್ನ ವಿಷಯಗಳು)
ಫೈಲ್ ಓದುವ ಪ್ರಕ್ರಿಯೆ ಮುಗಿಯುವ ಮೊದಲೇ Node.js "End" ಎಂದು ಪ್ರಿಂಟ್ ಮಾಡುತ್ತದೆ. ಅದು ಕಾಯುವುದಿಲ್ಲ.
libuv ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುತ್ತದೆ:
• The Event Loop: ಕಾರ್ಯಗಳು (tasks) ಪೂರ್ಣಗೊಂಡಿವೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುವ ಲೂಪ್ ಅನ್ನು libuv ಚಲಾಯಿಸುತ್ತದೆ. ಕಾರ್ಯಗಳು ಪೂರ್ಣಗೊಂಡಾಗ ಇದು callbacks ಅನ್ನು ಒಂದು queue ನಲ್ಲಿ ಇರಿಸುತ್ತದೆ. • Thread Pool: JavaScript ಒಂದು ಥ್ರೆಡ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. libuv ವರ್ಕರ್ ಥ್ರೆಡ್ಗಳ ಒಂದು ಪೂಲ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. ಡಿಫಾಲ್ಟ್ ಆಗಿ, ಈ ಪೂಲ್ನಲ್ಲಿ 4 ಥ್ರೆಡ್ಗಳಿರುತ್ತವೆ. ಈ ಥ್ರೆಡ್ಗಳು ಈ ಕೆಳಗಿನಂತಹ ಭಾರೀ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತವೆ:
- File system operations
- DNS lookups
- Compression
- Cryptography • Networking: libuv ಎಂಬುದು HTTP, TCP, ಮತ್ತು UDP ಸಾಕೆಟ್ಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. ಇದು ಸರ್ವರ್ಗಳು ಏಕಕಾಲದಲ್ಲಿ ಅನೇಕ ಕನೆಕ್ಷನ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. • Timers: libuv ಎಂಬುದು setTimeout ಮತ್ತು setInterval ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ.
Execution flow ಈ ರೀತಿ ಇರುತ್ತದೆ:
- JavaScript ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ.
- libuv ಭಾರೀ ಕಾರ್ಯಗಳನ್ನು ಹಿನ್ನೆಲೆಗೆ (background) ತೆಗೆದುಕೊಂಡು ಹೋಗುತ್ತದೆ.
- JavaScript ಮುಂದಿನ ಸಾಲಿಗೆ ಮುಂದುವರಿಯುತ್ತದೆ.
- ಕಾರ್ಯವು ಮುಗಿದಾಗ libuv ಎಂಬುದು Event Loop ಗೆ ಸೂಚನೆ ನೀಡುತ್ತದೆ.
- Event Loop ನಿಮ್ಮ callback ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ.
ಒಂದು ಪಿಜ್ಜಾ ಶಾಪ್ ಅನ್ನು ನೆನಪಿಸಿಕೊಳ್ಳಿ.
libuv ಇಲ್ಲದಿದ್ದರೆ, ನೀವು ಕೌಂಟರ್ ಬಳಿ ನಿಂತು ಪ್ರತಿ ಹತ್ತು ಸೆಕೆಂಡಿಗೆ "ನನ್ನ ಆಹಾರ ಸಿದ್ಧವಿದೆಯೇ?" ಎಂದು ಕೇಳುತ್ತೀರಿ. ನೀವು ಸಾಲನ್ನು (line) ತಡೆಯುತ್ತೀರಿ.
libuv ಇದ್ದರೆ, ನೀವು ಆರ್ಡರ್ ಮಾಡಿ, ಕುಳಿತುಕೊಳ್ಳುತ್ತೀರಿ ಮತ್ತು ನೋಟಿಫಿಕೇಶನ್ಗಾಗಿ ಕಾಯುತ್ತೀರಿ. ಪಿಜ್ಜಾ ಸಿದ್ಧವಾಗುವವರೆಗೆ ನೀವು ಇತರ ಕೆಲಸಗಳನ್ನು ಮಾಡಲು ಮುಕ್ತರಾಗಿರುತ್ತೀರಿ.
Summary:
• JavaScript execution: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv
Node.js ಅನ್ನು ವೇಗವಾಗಿರಿಸುವ ಇಂಜಿನ್ libuv.
