Jestem nowy w nodeJS i zastanawiałem się nad modelem pojedynczej instancji węzła. W prostej aplikacji nodeJs, gdy jakakolwiek operacja blokowania jest asynchronicznie obsługiwana za pomocą wywołań zwrotnych, czy wątek główny, na którym działa nodeJs, obsługuje także wywołanie zwrotne ?. Jeśli żądanie polega na usunięciu niektórych danych z bazy danych, a istnieje 100 użytkowników jednocześnie, a każda operacja db zajmuje kilka sekund, po ostatecznym uruchomieniu wywołania zwrotnego (dla każdego połączenia) główny wątek akceptuje te żądania używane również do wywołania zwrotnego? Jeśli tak, w jaki sposób nodeJs skaluje się i jak reaguje tak szybko ?.Mechanizm zwrotny Nodejsa - który wątek obsługuje wywołanie zwrotne?
Odpowiedz
Każda instancja nodejs działa w jednym wątku. Kropka. Kiedy wykonujesz połączenie asynchroniczne z, powiedzmy, żądaniem sieciowym, nie czekasz na to, nie w swoim kodzie ani nigdzie indziej. Ma pętlę zdarzeń, przez którą przechodzi. Gdy odpowiedź jest gotowa, wywołuje ona twoje oddzwanianie.
Może to być niezwykle wydajne, ponieważ nie wymaga dużej liczby wątków i całej pamięci, ale oznacza, że należy uważać, aby nie blokować synchronicznie.
Istnieje dość przyzwoite wyjaśnienie pętli zdarzeń pod numerem http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ i warto obejrzeć oryginalną prezentację jsconf Ryana Dahla http://www.youtube.com/watch?v=ztspvPYybIY. Czy kiedykolwiek inżynier dostał owację na stojąco za prezentację techniczną?
To wciąż jest trochę niejasne dla mnie. Więc jeśli istnieje 100 równoczesnych użytkowników, czy będzie tylko jedna instancja działającego węzła lub 100 ?. Biorąc pod uwagę, że istnieje wywołanie asynchroniczne z wywołaniem zwrotnym, a wątek (np. WątekA) kończy ten fragment kodu po złożeniu żądania sieciowego/db, gdy wywołanie zwrotne jest uruchomione, czy to wątekA wykonuje to wywołanie zwrotne ?. – Rakesh
Tak. Jeśli istnieje 100 "równoczesnych użytkowników" (to jest użytkownicy wysyłający żądania sieciowe dla instancji nodejs), to nadal istnieje tylko jedno wystąpienie węzła. Po wysłaniu żądania pojedynczy wątek go obsługuje. Kiedy wykonuje asynchroniczne wywołanie odczytu pliku lub dostępu do usługi sieciowej lub czegoś podobnego, wciąż jest to ten sam wątek. Po uzyskaniu dostępu i wywołaniu wywołania zwrotnego nadal jest to ten sam wątek. Możesz * może * mieć uruchomione instancje wielu trybów, jeśli możesz je przedostać z jakimś mechanizmem równoważenia obciążenia, a klaster węzłów jest zaplanowany, ale nadal jest eksperymentalny. – deitch
@deitch W jaki sposób jedyny wątek nie blokuje się, gdy robi 100 rzeczy w tym samym czasie? Powiedzmy o 100 rzeczach, z których każda trwa 1 sekundę, jeśli wszystkie są w jednym wątku, muszą być zrobione seriami, więc czy oznacza to, że zablokuje się na 100 sekund? –
Znalazłem to bardzo pomocne: http://rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx – Rakesh