Node.js Event Loop Wyjaśniony
Node.js korzysta z pojedynczego wątku. Możesz się zastanawiać, jak obsługuje on tysiące żądań jednocześnie.
Tajemnicą jest Event Loop.
Zamiast czekać na zakończenie zadania, Node.js przekazuje czasochłonne zadania do systemu operacyjnego. Kontynuuje przechodzenie do kolejnego zadania. Dzięki temu Twoje aplikacje są szybkie i responsywne.
Blokowanie vs. Nieblokowanie
Jeśli używasz funkcji synchronicznych, takich jak readFileSync, serwer się zatrzymuje. Czeka, aż plik zostanie w całości odczytany. Żaden inny użytkownik nie otrzyma odpowiedzi. To drastycznie obniża wydajność.
Jeśli używasz fs.readFile, serwer pracuje dalej. Obsługuje inne żądania, podczas gdy plik jest odczytywany w tle.
Jak działa Event Loop
Pętla przechodzi przez kilka etapów:
• Timers: Obsługuje setTimeout i setInterval.
• Pending Callbacks: Obsługuje błędy na poziomie systemu.
• Poll: Przyjmuje nowe połączenia i obsługuje operacje I/O, takie jak zapytania do bazy danych.
• Check: Obsługuje setImmediate.
• Close Callbacks: Obsługuje zamykanie gniazd (sockets).
Kolejność priorytetów
Nie wszystkie zadania są równe. Node.js korzysta z dwóch kolejek:
- Microtask Queue: Przechowuje
Promises. - Callback Queue: Przechowuje
setTimeouti I/O.
Microtask Queue zawsze wykonuje się jako pierwsza. Jeśli masz Promise i setTimeout, Promise zakończy się przed timerem.
Call Stack i kolejki
Call Stack śledzi, jaki kod jest aktualnie wykonywany. Gdy zadanie się kończy, jego callback trafia do kolejki. Event Loop czeka, aż Call Stack będzie pusty, zanim pobierze zadania z kolejki.
Unikaj tych błędów:
• Nie używaj nieskończonych pętli. To zamraża całą aplikację. • Nie używaj synchronicznych metod operacji na plikach w środowisku produkcyjnym. • Nie wykonuj ciężkich obliczeń matematycznych ani przetwarzania wideo na głównym wątku.
W przypadku ciężkich zadań używaj Worker Threads lub zadań w tle.
Podsumowanie
Node.js jest szybki, ponieważ nie czeka. Deleguje zadania I/O i wykorzystuje Event Loop do zarządzania wynikami. Ta architektura pozwala jednemu wątkowi obsługiwać wielu użytkowników.
Która część Event Loop była dla Ciebie najtrudniejsza do nauki? Daj znać w komentarzach.