2012-05-12 33 views
5

Wiem, że Node.js jest dobry w utrzymywaniu dużej liczby równoczesnych połączeń trwałych, na przykład w pokoju rozmów dla wielu wielu użytkowników.nodejs - Dlaczego Node.js może obsłużyć dużą liczbę jednoczesnych połączeń trwałych?

Zastanawiam się, jak to osiągnąć. Chodzi mi o to, że używa TCP/IP, który jest enkapsulowany przez podstawowy system operacyjny, dlaczego tak dobrze radzi sobie z trwałymi połączeniami, że inni nie mogą?

Co to ma magiczne znaczenie?

+5

@MartinJames: Wydaje mi się, że odeszliśmy z czasów, gdy JS był domeną dziecięcych skryptów. Nie potrzeba żadnych uwag językowych. – Amadan

+0

@Amadan Pytanie OP jest na granicy bycia promocją biznesową. To nie brzmi jak "Praktyczne, odpowiedzialne pytanie oparte na faktycznych problemach", (faq). Uwaga językowa wydawała się odpowiednia. Nie odrzucałem go ani nie głosowałem, aby zamknąć, ponieważ jest szansa, że ​​jest to prawdziwe pytanie. –

+0

@MartinJames: Nie, jeśli uważasz, że pytanie nie należy do SO, wskazówka do FAQ jest odpowiednia, nie to. Czy odpowiedziałbyś tak samo, gdyby pytanie dotyczyło [node.cs] (https://github.com/Rduerden/Node.cs), a wszystkie inne rzeczy były równe? – Amadan

Odpowiedz

6

Node.js powoduje, że wszystkie operacje wejścia/wyjścia są asynchroniczne. Działa tylko w jednym wątku, ale wykonuje inne żądania lub operacje podczas oczekiwania na I/O.

W przeciwieństwie do klasycznych serwerów sieciowych nie będzie obsługiwać innego żądania, dopóki poprzednie nie zostanie w pełni wykonane. Z tego powodu Apache uruchamia kilka procesów w tym samym czasie; załóżmy, że jest 10 procesów 10 httpd, co zwykle oznacza, że ​​można wysłać 10 żądań w dowolnym momencie (*). Jeśli ukończenie procesów zajmie więcej czasu, będziesz obsługiwał mniej zgłoszeń - lub będziesz musiał odradzać więcej procesów, nawet jeśli proces nie działa - np. Czekanie, aż baza przeżyje i zwróci dane.

Proces node.js, w obliczu żądania, które przejdzie do bazy danych, pozostawia bazę danych do pracy, gdy przejdzie do innego żądania.

*) MPM czyni to nie do końca prawdą, ale jest wystarczająco prawdziwe dla wszystkich intencji i celów.

+1

Jestem bardzo ciekawy, że jeśli Node.js używa właśnie non-blocking IO, dlaczego inne giganty, takie jak Apache, nie są w stanie wytworzyć tak niezablokowanej rzeczy? Dlaczego httpd nie jest modyfikowany do tego rodzaju ram? i czy oni mogą? –

+1

Bezpieczeństwo. Apache robi to, co robi dobrze; oddzielenie wniosków od siebie jest częścią tego. Jednak, gdy nie chcesz, aby żądania były izolowane, Apache nie radzi sobie z nimi bardzo dobrze; chociaż pomoc Phusion Passenger i FastCGI. Pamiętaj: Apache obsługuje przede wszystkim strony statyczne; wszystko inne przechodzi przez CGI lub poprzez wtyczki (moduły Apache). Zatem optymalizacja Apache dla I/O jest jak optymalizacja gęsi do ciągnięcia wózków. (Z drugiej strony, mówiąc o Ruby lub Pythonie, oba mogą zrobić to samo co plik node.js poprzez odpowiednie biblioteki asynch - EventMachine lub Twisted.) – Amadan

0

Chodzi o to, że większość serwerów internetowych (takich jak apache itp.) Działa za pomocą odradzania wątków, w których tworzą nowy wątek dla każdego przychodzącego żądania HTTP. te wątki są synchroniczne i blokują w naturze =>, co oznacza, że ​​będą wykonywać kod w kolejności, w jakiej zostały zapisane, a wszelkie dalsze obliczenia będą blokowane przez bieżące zadanie we/wy lub obliczenia. Jeśli chcesz posłuchać wydarzenia takiego jak: - przesyłanie czatów przez rozmówcę, musisz mieć dedykowany wątek na użytkownika (na użytkownika jest konieczne utrzymywanie trwałego połączenia, jest kilka możliwych technik optymalizacji, ale wciąż możesz założyć wątki użytkownik), słuchając tego wydarzenia, a ten wątek zostanie zablokowany w oczekiwaniu na to wydarzenie. Tak więc dla każdego wątku tarowania i blokowania serwera WWW

JavaScript z drugiej strony nie blokuje (i przewodzi kod asynchroniczny) przez naturę => tutaj rejestrujesz wywołanie zwrotne dla zdarzenia i kiedy pojawia się jakaś funkcja wywołania zwrotnego zostanie wykonane. Nie będzie blokować w żadnym momencie oczekiwania na to wydarzenie.

Możesz znaleźć więcej informacji na ten temat, czytając o serwerach nieblokujących lub asynchronicznych.

+0

JavaScript nie jest asynchroniczny, a node.js to. JavaScript jest raczej raczej przewodzący asynchronicznemu stylowi kodowania (lub raczej kontynuacji stylu), ze względu na pierwszorzędne obywatelstwo funkcji; ale w samym JavaScript nie ma nic szczególnie asynchronicznego. – Amadan

Powiązane problemy