The Event Loop: How One Thread Outruns an Army
Discover how the Node.js event loop handles thousands of concurrent users on a single thread. Learn about the V8 call stack, libuv, and how to prevent server starvation.
A traditional server spins up thousands of threads to handle massive traffic, but Node.js conquers the same load using just a single thread. This episode demystifies the inner workings of the V8 call stack, libuv's background thread pool, and the precise execution priority separating tasks from microtasks. Understanding this underlying asynchronous mechanism allows software engineers to prevent catastrophic server starvation, eliminate memory leaks from misplaced event listeners, and write highly scalable applications. How does a single-threaded architecture juggle thousands of concurrent database requests without ever breaking a sweat?
Chapters
ఒక పెద్ద రెస్టారెంట్లో పది వేల మంది కస్టమర్లు ఒకేసారి ఆర్డర్ ఇచ్చారనుకోండి. కానీ వంటగదిలో మాత్రం ఒకే ఒక్క చెఫ్ ఒంటరిగా పనిచేస్తున్నాడు. మామూలుగా ఒక వెబ్సైట్కి ఒకే సెకనులో పది వేల మంది యూజర్లు వచ్చినప్పుడు, పాత పద్ధతి ప్రకారం పది వేల మంది కంప్యూటర్ వర్కర్లు అవసరం అవుతారు.
కానీ ఇక్కడ ఉన్న ఆ ఒక్క వర్కరే ఏమాత్రం కంగారు పడకుండా అందరికీ సమాధానం పంపిస్తున్నాడు. కంప్యూటర్ ప్రపంచాన్ని నడిపించే ఈ ఒక్క థ్రెడ్ వెనుక ఉన్న అసలు రహస్యమే, ఇవెంట్ లూప్.
వెల్కమ్ టు పాడ్-దిస్ అండ్ అన్టోల్డ్ టేల్స్. ఈరోజు మనం నోడ్ డాట్ జే-ఎస్ ఈవెంట్ లూప్ ఎలా పనిచేస్తుందో తెలుసుకుందాం. మనతో పాటు సాఫ్ట్వేర్ సిస్టమ్స్ నిపుణుడు ఎడ్మండ్ ఉన్నారు.
కేవలం ఒక్క థ్రెడ్తోనే వేలాది రిక్వెస్ట్లను మేనేజ్ చేసే ఈ టెక్నాలజీ నిజంగా ఆశ్చర్యంగా అనిపిస్తుంది.
అసలు ఒకే ఒక్క థ్రెడ్ వేలాది మంది యూజర్ల రిక్వెస్ట్లను క్రాష్ అవ్వకుండా ఎలా హ్యాండిల్ చేస్తుంది? మొదట మనం ఆ ఒక్క థ్రెడ్ పనితీరు గురించి చూద్దాం. ఆ తర్వాత కాల్ స్టాక్ పరిమితులు, లిబ్-యూ-వీ లాంటి బ్యాక్గ్రౌండ్ అసిస్టెంట్లు, ఇంకా ప్రామిసెస్ లాంటి వీ-ఐ-పీ క్యూల గురించి తెలుసుకుందాం. చివరగా ఒక చిన్న తప్పు మొత్తం సిస్టమ్ను ఎలా ఆపేస్తుందో కూడా చూద్దాం.
A Thousand Hungry Guests, One Cook
రాత్రి తొమ్మిది గంటల సమయానికి Threadbase డ్యాష్బోర్డ్లో ఒకేసారి వెయ్యి మంది యూజర్లు గెట్ పోస్ట్స్ ఫీడ్ను క్లిక్ చేస్తున్నారు. పాత సర్వర్లు అయితే ఈ భారీ లోడ్ను తట్టుకోవడానికి వెయ్యి వేర్వేరు థ్రెడ్లను క్రియేట్ చేస్తాయి. దానివల్ల మెమరీ చాలక అవి స్తంభించిపోతాయి. కానీ ఇక్కడ Node.
js ఒక పెద్ద రెస్టారెంట్లో ఒంటరిగా పనిచేసే ఒకే ఒక్క చెఫ్లా వ్యవహరిస్తుంది. ఆ చెఫ్ వంట పాత్ర స్టవ్ మీద పెట్టి అది ఉడికే వరకు ఖాళీగా నిలబడడు. డేటాబేస్ క్వెరీని వెంటనే బ్యాక్గ్రౌండ్కి పంపించి మరుసటి యూజర్ రిక్వెస్ట్ను అందుకోవడానికి సిద్ధంగా ఉంటాడు.
వెయ్యి మంది యూజర్లు ఒకేసారి క్లిక్ చేసినప్పుడు పాత సర్వర్లు ఆగిపోతాయి. కానీ నోడ్ మాత్రం ఒకే ఒక్క చెఫ్లా అందరినీ హ్యాండిల్ చేస్తుందని చెప్పారు. అసలు ఒకే ఒక థ్రెడ్తో ఇది ఎలా సాధ్యం ఎడ్మండ్?
పాత కాలపు సర్వర్లు ప్రతి కొత్త యూజర్ కోసం ఒక ప్రత్యేకమైన థ్రెడ్ను క్రియేట్ చేస్తాయి. ఆ యూజర్ డేటాబేస్ నుండి సమాచారం పొందే వరకు ఆ థ్రెడ్ ఏ పనీ చేయకుండా అలాగే ఖాళీగా కూర్చుంటుంది. దీనివల్ల సర్వర్ మెమరీ చాలా వృధా అవుతుంది. కానీ నోడ్ ఈ పద్ధతిని మార్చేసింది. నోడ్లో జావాస్క్రిప్ట్ కోడ్ను రన్ చేయడానికి కేవలం ఒకే ఒక్క థ్రెడ్ మాత్రమే ఉంటుంది.
ఒక్క థ్రెడ్ మాత్రమే ఉంటే మొదటి యూజర్ పని పూర్తయ్యే వరకు మిగతా వేలాది మంది వెయిట్ చేయాలి కదా? మరి అలాంటప్పుడు సర్వర్ ఇంకా స్లో అయిపోవాలి కదా?
అక్కడే నోడ్ తన అసలైన ట్రిక్ చూపిస్తుంది. మన Threadbase యాప్లో గెట్ పోస్ట్స్ రిక్వెస్ట్ వచ్చినప్పుడు ఏం జరుగుతుందో చూద్దాం. ఆ సమయంలో వచ్చే డేటాబేస్ క్వెరీ కోసం మెయిన్ థ్రెడ్ ఎదురుచూస్తూ కూర్చోదు. ఆ వెయిట్ చేసే పనులన్నింటినీ నోడ్ వెంటనే బ్యాక్గ్రౌండ్కి పంపించేస్తుంది.
అంటే మెయిన్ థ్రెడ్ ఆ భారీ పనిని మరొకరికి అప్పగించేసి తప్పుకుంటుందన్నమాట.
అవును. ఆ క్వెరీ బ్యాక్గ్రౌండ్కి వెళ్ళగానే మెయిన్ థ్రెడ్ వెంటనే ఫ్రీ అయిపోతుంది. అది మరుసటి యూజర్ రిక్వెస్ట్ను అందుకోవడానికి సిద్ధంగా ఉంటుంది. ఇలా వెయిట్ చేసే పనులను బ్యాక్గ్రౌండ్కి పంపి మెయిన్ థ్రెడ్ వేలాది యూజర్లను ఒకేసారి హ్యాండిల్ చేస్తుంది. అందుకే నోడ్ ఎక్కడా ఆగకుండా వేగంగా రన్ అవుతుంది.
అసలు ఈ ఒక్క వర్కర్ వేలాది పనులను ఎలా గుర్తుపెట్టుకుంటాడు? ఇక్కడే కాల్ స్టాక్ అనే కాన్సెప్ట్ వస్తుంది.
The Magic Notebook Called the Call Stack
ఆ ఒక్క వర్కర్ వేలాది పనులను ఎలా గుర్తుపెట్టుకుంటాడు అని మాట్లాడుకుంటున్నాం కదా. ఇక్కడే కాల్ స్టాక్ అనే కాన్సెప్ట్ వస్తుందని చెప్పారు కదా ఎడ్మండ్?
అవును నోరా. మన క్రోమ్ బ్రౌజర్లో ఉండే వి ఎయిట్ ఇంజిన్ను నోడ్ జెఎస్ వాడుతుంది. ఈ ఇంజిన్లో ఒకే ఒక్క కాల్ స్టాక్ ఉంటుంది.
ఒకే ఒక్క స్టాక్ అంటే ఒక సమయంలో ఒకే ఒక్క పని మాత్రమే జరుగుతుందని అర్థమా?
అవును. ఒక ఫంక్షన్ వచ్చినప్పుడు అది స్టాక్లోకి వెళ్తుంది. దీన్ని పుష్ అంటారు. ఆ ఫంక్షన్ పని పూర్తయ్యాక అది బయటకు వచ్చేస్తుంది. దీన్ని పాప్ అంటారు.
ఒకదాని తర్వాత ఒకటి. అంతా చాలా పద్ధతిగా జరుగుతున్నట్టు అనిపిస్తోంది కదూ.
నిజమే. కానీ దీనికి ఒక పరిమితి ఉంది. ఒక ఫంక్షన్ బ్రేక్ లేకుండా పదే పదే తనను తానే కాల్ చేసుకుంటూ పోయింది అనుకోండి. అప్పుడు ఆ స్టాక్ నిండిపోతుంది.
అలా నిండిపోతే ఏం జరుగుతుంది?
వి ఎయిట్ ఇంజిన్ వెంటనే రేంజ్ ఎర్రర్ చూపిస్తుంది. మాగ్జిమమ్ కాల్ స్టాక్ సైజ్ ఎక్సీడెడ్ అని స్క్రీన్ మీద కనిపిస్తుంది. దాన్నే మనం స్టాక్ ఓవర్ఫ్లో అంటాం.
అంటే ఆ కంప్యూటర్ మెమరీలో ఒక చిన్న గది పూర్తిగా నిండిపోయి ఆగిపోయిందన్నమాట.
అవును. అందుకే ఇక్కడ ఒక ముఖ్యమైన నియమం ఉంది. ఈ కాల్ స్టాక్ పూర్తిగా ఖాళీ అయ్యేదాకా ఈవెంట్ లూప్ ఏ కొత్త పనినీ మొదలుపెట్టదు.
Delegating Heavy Lifting to Backroom Assistants
గత చాప్టర్ చివర్లో మనం ఒక ముఖ్యమైన ప్రశ్న దగ్గర ఆగాం. మెయిన్ కాల్ స్టాక్ పూర్తిగా ఖాళీ అయ్యేదాకా ఏ అసింక్రోనస్ కోడ్ కూడా రన్ అవ్వలేనప్పుడు, మరి ఫైల్స్ చదవడం లాంటి లేట్ అయ్యే పనుల కోసం నోడ్ జెఎస్ సర్వర్ ఎందుకు స్తంభించిపోదు?
ఎందుకంటే ఆ లేట్ అయ్యే పనులేవీ అసలు జావాస్క్రిప్ట్ మెయిన్ థ్రెడ్ మీద రన్ అవ్వవు. మనం ఒక ఫైల్ చదవాలని లేదా డేటాబేస్ క్వెరీ పంపాలని కోడ్ రాసినప్పుడు, నోడ్ జెఎస్ ఆ బాధ్యతను వెనుక ఉన్న లిబ్ యూవీ అనే ఒక పవర్ఫుల్ సి ప్లస్ ప్లస్ లైబ్రరీకి అప్పగిస్తుంది.
అంటే జావాస్క్రిప్ట్ ఒక్కటే పనిచేస్తున్నట్టు కనిపిస్తున్నా, దాని వెనుక ఒక పెద్ద సాయం ఉందన్నమాట. ఈ లిబ్ యూవీ బ్యాక్గ్రౌండ్లో ఏం చేస్తుంది?
ఇది డిఫాల్ట్గా నాలుగు బ్యాక్గ్రౌండ్ థ్రెడ్స్ను నడుపుతుంది. హార్డ్ డిస్క్ నుండి ఫైల్స్ చదవడం, నెట్వర్క్ అడ్రస్లు వెతకడం, లేదా పాస్వర్డ్లను ఎన్క్రిప్ట్ చేయడం లాంటి బరువైన పనులను ఈ నాలుగు థ్రెడ్స్ పంచుకుంటాయి.
అయితే నోడ్ జెఎస్ పూర్తిగా సింగిల్ థ్రెడ్ కాదు అని అనుకోవచ్చా?
మీరు రాసే జావాస్క్రిప్ట్ కోడ్ మాత్రం ఒకే ఒక్క థ్రెడ్ మీద రన్ అవుతుంది. కానీ ఈ లిబ్ యూవీ హెల్పర్ థ్రెడ్స్ బ్యాక్గ్రౌండ్లో పని పూర్తి చేసి పెడతాయి. పని పూర్తయ్యాక, ఆ ఫంక్షన్ లేదా కాల్బ్యాక్ నేరుగా మెయిన్ స్టాక్లోకి వెళ్ళదు.
వెళ్తే రన్ అవుతున్న కోడ్ డిస్టర్బ్ అవుతుంది కదా, మరి ఎక్కడ వెయిట్ చేస్తుంది?
అది టాస్క్ క్యూ అనే ఒక లైన్ లో నిలబడుతుంది. మెయిన్ కాల్ స్టాక్ ఎప్పుడు ఖాళీ అవుతుందా అని ఈ ఈవెంట్ లూప్ నిరంతరం గమనిస్తూ ఉంటుంది. స్టాక్ ఖాళీ అవ్వగానే, టాస్క్ క్యూలో ఉన్న మొదటి కాల్బ్యాక్ను తీసుకెళ్లి స్టాక్లో పెడుతుంది.
ఇక్కడే నాకు ఒక అనుమానం ఉంది. మనం కోడ్లో సెట్ టైమౌట్ రాసి టైమ్ సున్నా మిల్లీసెకన్లు అని పెడితే, అది వెంటనే రన్ అయిపోవాలి కదా?
అక్కడే చాలా మంది పొరపడతారు. సున్నా అని పెట్టినా అది వెంటనే రన్ అవ్వదు. ఆ కాల్బ్యాక్ కూడా బ్యాక్గ్రౌండ్ దాటి టాస్క్ క్యూలోకి వచ్చి నిలబడాల్సిందే. ప్రస్తుత సింక్రోనస్ కోడ్ అంతా పూర్తయి స్టాక్ ఖాళీ అయ్యేంత వరకు దానికి చాన్స్ రాదు.
అంటే సున్నా మిల్లీసెకన్లు అంటే వెంటనే అని కాదు, వీలైనంత త్వరగా అని అర్థం. మరి ఒక ఫైల్ చదివే పని లోపల సెట్ టైమౌట్ మరియు సెట్ ఇమ్మీడియట్ అనే రెండు రకాల టైమర్లను ఒకేసారి రాస్తే ఏది ముందు రన్ అవుతుంది?
అలాంటి ఫైల్ రీడ్ లేదా ఐ ఓ పనుల లోపల రాసినప్పుడు, ఎప్పుడూ సెట్ ఇమ్మీడియట్ మాత్రమే ముందే రన్ అవుతుంది. ఎందుకంటే ఈవెంట్ లూప్ తిరిగేటప్పుడు ఐ ఓ పనులు ముగిసిన వెంటనే ఈ సెట్ ఇమ్మీడియట్ చెక్ చేసే ఫేజ్ వస్తుంది. సెట్ టైమౌట్ తర్వాతి రౌండ్లో వస్తుంది.
అంటే బ్యాక్గ్రౌండ్ హెల్పర్లు బరువైన పనులు చేస్తూ, టాస్క్ క్యూ ద్వారా మెయిన్ థ్రెడ్కు పనులను అందిస్తుంటాయి. కానీ ఈ క్యూలో అందరికీ సమాన ప్రాధాన్యత ఉండదు. కొందరికి వి ఐ పి పాస్ ఉంటుంది.
The Secret VIP Line for Promises
థ్రెడ్బేస్ సర్వర్పై ఒకేసారి వెయ్యి మంది యూజర్లు పడ్డారు. మానిటర్ స్క్రీన్ అంతా ఎర్రగా మారిపోతోంది. లీడ్ డెవలపర్ అనన్య కోడ్ని జాగ్రత్తగా గమనిస్తోంది. అక్కడ ఒక సెట్ టైమౌట్ టాస్క్, ఒక ప్రామిస్ మైక్రోటాస్క్ లైన్ లో ఉన్నాయి. ఒక పెద్ద రెస్టారెంట్లో ఒంటరిగా పనిచేసే ఒకే ఒక్క చెఫ్ లాగా, నోడ్.జెఎస్ ఒకే థ్రెడ్తో వీటన్నిటినీ హ్యాండిల్ చేయాలి.
ఆర్డర్లు కుప్పలుగా వస్తున్నా, ఆ చెఫ్ ముందుగా వీఐపీ పాస్ ఉన్న ప్రామిస్ల క్యూని పూర్తిగా ఖాళీ చేయడం మొదలుపెట్టాడు. సెట్ టైమౌట్ టైమర్ ఇంకా అలాగే వేచి చూస్తుండగానే, ప్రామిస్ టాస్క్ ముందే రన్ అయిపోయింది.
అనన్య స్క్రీన్పై ఆ వెయ్యి మంది యూజర్లు రావడం చూశాం. ఆ చెఫ్ టైమర్ను పక్కన పెట్టి ప్రామిస్లకే అంత ప్రాధాన్యత ఇస్తున్నాడు. కానీ ఆ చెఫ్ కొన్ని పనులకే ఎందుకు అంత ప్రత్యేక గౌరవం ఇస్తున్నాడు?
ఎందుకంటే నోడ్.జెఎస్ లోపల అన్ని పనులకూ ఒకే రకమైన విలువ ఉండదు. ఇక్కడ రెండు వేర్వేరు లైన్లు ఉంటాయి. వాటిని టాస్క్ క్యూ, మైక్రోటాస్క్ క్యూ అని పిలుస్తారు.
అంటే మన చెఫ్ కిచెన్లో రెండు వేర్వేరు ఆర్డర్ లైన్లు నడుపుతున్నాడన్నమాట.
సెట్ టైమౌట్ లాంటి సాధారణ పనులు టాస్క్ క్యూలోకి వెళ్తాయి. కానీ ప్రామిస్లు మాత్రం మైక్రోటాస్క్ క్యూలోకి చేరుతాయి. నియమం ప్రకారం, ఒకే ఒక్క సాధారణ టాస్క్ అవ్వగానే, ఈవెంట్ లూప్ మిగతా పనులను ఆపేస్తుంది. ఆ తర్వాత మైక్రోటాస్క్ క్యూని పూర్తిగా ఖాళీ చేస్తుంది.
అందుకే ప్రామిస్ ఎప్పుడూ సెట్ టైమౌట్ కంటే ముందే రన్ అవుతుంది. దానికి నిజంగానే వీఐపీ పాస్ ఉంది.
కానీ ఆ వీఐపీ లైన్ని కూడా దాటేసి ముందుకు వెళ్లే शक्ति ఇంకో దానికి ఉంది. అదే ప్రాసెస్ డాట్ నెక్స్ట్టిక్. ఇది ప్రామిస్ల కంటే ముందే క్యూ లైన్ లో అందరినీ వెనక్కి నెట్టేసి లోపలికి దూకేస్తుంది.
లైన్ లో అందరినీ వెనక్కి నెట్టేయడం అంటే, మిగతా యూజర్ల రిక్వెస్ట్లు ఆగిపోవా?
నిజానికి ఆగిపోతాయి. లూప్ ఆ మైక్రోటాస్క్లను ఖాళీ చేసే పనిలోనే నిరంతరాయంగా ఉండిపోతే, వెనకాల ఉన్న సాధారణ పనులకు అసలు వంతే రాదు.
అందుకే అనన్య స్క్రీన్పై ఆ ఎర్రటి అలర్ట్ కనిపిస్తోంది. ఆ ఒంటరి చెఫ్ మిగతా కిచెన్ ఆర్డర్లను పూర్తిగా వదిలేసి, ఆ ఒక్క పనిలోనే చిక్కుకుపోయాడు.
స్క్రీన్పై డేటా రావడం ఆగిపోయింది. థ్రెడ్బేస్ సర్వర్ పూర్తిగా స్తంభించిపోయింది. అనన్య కీబోర్డ్పై వేగంగా టైప్ చేస్తూ, ఎక్కడ తప్పు జరిగిందో వెతుకుతోంది. ప్రాసెస్ డాట్ నెక్స్ట్టిక్ అనే కమాండ్ ప్రామిస్ల కంటే ముందే, క్యూ లైన్ లో అందరినీ నెట్టేసి లోపలికి దూరింది.
ఒక పెద్ద రెస్టారెంట్లో ఒంటరిగా పనిచేసే ఆ ఒక్క చెఫ్, కిచెన్లోని మిగతా ఆర్డర్లను వదిలేశాడు. ఈ ఒక్క పనిలోనే ఆయన నిరంతరాయంగా చిక్కుకుపోయాడని ఆమె స్క్రీన్పై ఉన్న ఎర్రటి అలర్ట్ చూసి గుర్తిస్తుంది.
When One Slow Recipe Ruins the Night
ఆనంద్ మానిటర్ స్క్రీన్ వైపు చూస్తుండగా థ్రెడ్బేస్ సర్వర్ పూర్తిగా స్తంభించిపోయింది. ఇది ఎలాంటిదంటే, ఒకే ఒక్క చెఫ్ ఉన్న పెద్ద రెస్టారెంట్లో, ఆ చెఫ్ ఒకే ఒక పెద్ద పని దగ్గర ఆగిపోతే మిగతా కస్టమర్ల ఆర్డర్లు ఆగిపోయినట్టు అయింది. ఇక్కడ ఒక భారీ జేసన్ పార్స్ కోడ్ ఆ సింగిల్ థ్రెడ్ను పూర్తిగా లాక్ చేసింది. వేలాది మంది యూజర్లు ఫీడ్ కోసం ఎదురుచూస్తున్నారు.
అదే సమయంలో మానిటర్ పైన ఎర్రటి అలర్ట్ లైట్లు వెలుగుతున్నాయి. ఆనంద్ కీబోర్డ్పై చేతులు పెట్టేలోపే, సర్వర్ మెమొరీ హ్యాంగ్ అయిపోయింది. రెస్పాన్స్ ఇవ్వడం పూర్తిగా ఆపేసింది.
ఆనంద్ స్క్రీన్ పైన ఆ ఎర్రటి అలర్ట్ లైట్లు రావడం చూస్తే ఆందోళన కలుగుతుంది. ఒకే ఒక్క జేసన్ పార్స్ వల్ల మొత్తం థ్రెడ్బేస్ సర్వర్ స్తంభించిపోయింది. ఒకే ఒక చెఫ్ ఉన్న పెద్ద రెస్టారెంట్లో, ఆ చెఫ్ ఒకే ఒక పెద్ద పని దగ్గర ఆగిపోతే మిగతా కస్టమర్ల ఆర్డర్లు ఆగిపోయినట్టు అయింది కదా?
జావాస్క్రిప్ట్కు ఉన్నది ఒకే ఒక్క కాల్ స్టాక్. మనం ఒక పెద్ద ఫర్ లూప్ లేదా బరువైన జేసన్ పార్స్ కోడ్ రన్ చేసినప్పుడు, ఆ సింగిల్ థ్రెడ్ పూర్తిగా బ్లాక్ అయిపోతుంది. అది పూర్తయ్యే వరకు ఈవెంట్ లూప్ తర్వాతి రిక్వెస్ట్ను అస్సలు తాకలేదు.
అంటే ఒక్క యూజర్ చేసే పెద్ద పని వల్ల, మిగతా వేలాది మంది యూజర్ల ఫీడ్ ఆగిపోతుందా? ఒకే ఒక్క థ్రెడ్ ఉండటం వల్ల ఇంత పెద్ద రిస్క్ ఉందా?
దీనినే మనం స్టార్వేషన్ అంటాం, అంటే టాస్క్లను ఆకలితో ఉంచడం అన్నమాట. కేవలం భారీ లూప్లు మాత్రమే కాదు, ఒక ప్రామిస్ చైన్ ఆగకుండా కొత్త మైక్రోటాస్క్లను క్రియేట్ చేస్తూనే ఉంటే, వెనకాల క్యూలో ఉన్న మిగతా యూజర్లకు అసలు ఛాన్సే దొరకదు. మైక్రోటాస్క్ క్యూ పూర్తిగా ఖాళీ అయితేనే ఈవెంట్ లూప్ తర్వాతి పనికి వెళ్తుంది.
ఓహో, అంటే వీఐపీ లైన్ లో జనం వస్తూనే ఉంటే, మామూలు లైన్ లో ఉన్నవాళ్లు ఎప్పటికీ ఎదురుచూస్తూనే ఉండాలి. మరి ఈ గందరగోళాన్ని ఆపడానికి, కోడ్ను సింపుల్గా ఉంచడానికి డెవలపర్లు ఏం చేస్తారు?
ఇక్కడే నోడ్ మనకు ఈవెంట్ ఎమిటర్ అనే టూల్ను ఇస్తుంది. దీని ద్వారా మనం సొంతంగా ఈవెంట్స్ క్రియేట్ చేసి మేనేజ్ చేయొచ్చు. ఉదాహరణకు, ఒక యూజర్ కాメント పెట్టినప్పుడు బస్ డాట్ ఎమిట్ కామెంట్ క్రియేటెడ్ అని ఒకే ఒక్క లైన్ రాస్తే సరిపోతుంది. ఇది కోడ్ను చాలా సింపుల్గా ఉంచుతుంది.
ఆ ఒక్క లైన్ రాయడం వల్ల బ్యాక్గ్రౌండ్లో ఏం జరుగుతుంది? ఆ ఈవెంట్ కోసం ఎదురుచూసే వాళ్లంతా అలర్ట్ అవుతారా?
ఆ కాメント పడిన వెంటనే నోటిఫికేషన్ పంపడం, డేటాబేస్ అప్డేట్ చేయడం లాంటి పనులన్నీ వేర్వేరు లిజనర్స్ చూసుకుంటారు. అయితే ఇక్కడ ఒక జాగ్రత్త అవసరం. ఒకే ఈవెంట్కు పది కంటే ఎక్కువ లిజనర్స్ యాడ్ చేస్తే, మెమొరీ లీక్ అవుతుందని నోడ్ జేఎస్ మనకు మాక్స్ లిజనర్స్ ఎక్సీడెడ్ వార్నింగ్ అని హెచ్చరిక ఇస్తుంది.
అంటే పది మంది కంటే ఎక్కువ మంది వింటుంటే సిస్టమ్ హెచ్చరిస్తుందన్నమాట. మరి చివరగా చెప్పండి, ఒకే ఒక్క థ్రెడ్ వేలాది యూజర్ల రిక్వెస్ట్లను క్రాష్ అవ్వకుండా ఒకేసారి ఎలా హ్యాండిల్ చేస్తుంది?
నోడ్ జేఎస్ మ్యాజిక్ కాదు, అదొక తెలివైన మెకానిజం. నెమ్మదిగా జరిగే పనులను బ్యాక్గ్రౌండ్కి పంపిస్తుంది. ఆ తర్వాత ఈవెంట్ లూప్ ద్వారా ఒకే థ్రెడ్ వేలాది పనులను ఆగకుండా చేస్తుంది.
హైదరాబాద్లోని త్రెడ్బేస్ ఆఫీస్లో అర్ధరాత్రి రెండు గంటలు అవుతోంది. ఆనంద్ తన మానిటర్ వైపు నిశ్శబ్దంగా చూస్తున్నాడు. వేలాది మంది యూజర్లు ఒకేసారి ఫీడ్ను క్లిక్ చేయడంతో స్క్రీన్ కదలకుండా ఆగిపోయింది. కోడ్లో రాసిన ఒక బరువైన ఫర్ లూప్ వల్ల మొత్తం సర్వర్ స్తంభించిపోయింది. ఒక్క కొత్త రిక్వెస్ట్ కూడా ముందుకు వెళ్లడం లేదు.
ఇది ఒక పెద్ద రెస్టారెంట్లో ఒంటరిగా పనిచేసే ఒకే ఒక్క చెఫ్ లాంటి పరిస్థితి. ఆ చెఫ్ ఒక్క పెద్ద పనిలోనే ఉండిపోతే, బయట వెయ్యి మంది కస్టమర్లు ఆకలితో నిలబడాల్సి వస్తుంది. కీబోర్డ్పై ఆనంద్ వేళ్లు ఆగిపోయాయి. స్క్రీన్పై పెరుగుతున్న టైమౌట్ నంబర్లు ఆ ఒక్క లైన్ కోడ్ వల్ల జరిగే నష్టాన్ని కళ్ళకు కడుతున్నాయి.
ఒక చెఫ్ పొయ్యి మీద వంట పెట్టి, అది ఉడికేలోపు వేరే పనులకి వెళ్లినట్టు ఉంటుంది ఇది. నోడ్ జేఎస్ ఒకే థ్రెడ్తో వేలాది రిక్వెస్ట్లను ఎలా మేనేజ్ చేస్తుందో ఇప్పుడు మనకి అర్థమైంది.
ఆ వీఐపీ క్యూలో ఉన్న పనుల వల్లే, సాధారణ కస్టమర్లు ఆకలితో ఎదురుచూసే స్టార్వేషన్ పరిస్థితి కూడా వస్తుంది. బ్యాక్గ్రౌండ్ అసిస్టెంట్లు ఎంత సాయం చేసినా సరే, ఒక చిన్న తప్పు మొత్తం సిస్టమ్ను ఆపేయగలదు.
ఈ మెకానిజం వెనుక ఉన్న అసలు రహస్యం ఇదేనన్నమాట. ఎడ్మండ్, ఈ విషయాలన్నీ మాకు వివరించినందుకు చాలా థాంక్స్. శ్రోతలారా, ఈ కథ మీకు నచ్చితే అందరితో షేర్ చేయండి. మన కథ ప్రస్తుతానికి ఇక్కడితో ముగుస్తోంది.
Sources & further reading
Node.js Design Patterns
Provides an in-depth exploration of the reactor pattern and the foundational asynchronous mechanics behind Node.js.
You Don't Know JS Yet: Async & Performance
Offers an unparalleled breakdown of how JavaScript handles asynchronous execution, the call stack, and promises.
How this episode was made
Created by Vineela Tallam with PodThis. The script, research and voices are AI-generated with Google Gemini from the creator's topic. PodThis editors have not reviewed this episode.
Create your own podcast in minutes
Turn any topic into a professional podcast series with AI
Get Started Free
Comments (0)
Sign in to join the conversation