2013-07-30 14 views
5

Zaczynam więc używać node.js dla projektu, który robię.Proces potomny dla zadania intensywnego procesora?

Gdy klient zgłasza żądanie, mój serwer node.js pobiera z innego serwera plik json, a następnie przekształca go w nowy json, który jest obsługiwany przez tego klienta. Jednak json, który serwer węzła otrzymał z innego serwera, może być dość duży, więc "masowanie" danych jest dość intensywne.

Czytałem przez ostatnie kilka godzin, jak węzeł node.js nie jest idealny do zadań cpu, a główną odpowiedzią, jaką widziałem, jest odrodzenie procesu potomnego (w zasadzie plik .js uruchomiony przez inna instancja węzła), która zajmuje się intensywnymi zadaniami cpu, które mogą blokować główną pętlę zdarzeń.

Załóżmy, że mam 20 000 równoczesnych użytkowników, co oznaczałoby, że wygenerowałoby 20 000 stanowisk pracy na poziomie osa podczas wykonywania procesów potomnych.

Czy to brzmi jak dobry pomysł? (Inny serwer WWW utworzyłby po prostu 20 000 wątków w tym samym procesie.)

Nie jestem pewien, czy powinienem uruchomić proces potomny. Ale muszę wykonać zadanie bez blokowania intensywnego procesora cpu. Jakieś pomysły na to, co powinienem zrobić?

Odpowiedz

-2

Ludzie, którzy mówią, że nie wiedzą, jak tworzyć rozwiązania.

NodeJS jest dokładnie tym, co mówi: jest węzłem i powinno być traktowane w ten sposób.

W tym przykładzie instancja twojego węzła łączy się z zewnętrznym interfejsem API i pobiera json do przetworzenia i odesłania.

tj 1. Pierwsze // server.com/getJSON 2. Proces JSON 3. postu // server.com/postJSON

Więc co zrobić? Zadaj sobie pytanie, czy czas jest problemem? jeśli tak, to węzeł nie jest rozwiązaniem Jeśli jednak bardziej interesuje Cię moc przetwarzania surowego, więc zamiast 1 żądania wykonanego w ciągu 4 sekund

Jesteś zainteresowany 200 żądaniami ukończenia w 10 sekund, ale każda z nich zajmuje pełne 10 sekund.

Zdiagnozuj, ile czasu powinien poświęcić JSON na masaż, jeśli jest krótszy niż 1 sekunda. Po prostu uruchom instancję 4 węzłów zamiast 1.

Jednak jeśli jest bardziej złożona, podziel JSONA na segmenty do przetworzenia. Oraz asynchronicznego zwrotnych przetworzyć każdy segment

process.nextTick (funkcja (doprocess (segment1) process.nextTick (funkcja() {doprocess (segment2)

każdy doProcess wywołuje przy kolejnym doProcess

węzeł js będzie handlować czas pomiędzy żądaniami.

teraz podjąć takie rozwiązanie i skalować go zbyt 4 instancje węzłów na serwerze, a 2-5 serwery

i nagle masz bardzo skalowalne i opłacalne solutio n.

+0

posegmentować plik json, utworzyć 4 instancje węzłów na serwer i 2-5 serwerów? a teraz mam niezwykle skalowalne i opłacalne rozwiązanie? .. gee świst. – foreyez

+0

Jest to prostsze, niż się wydaje. To 2-5 serwerów jest dla ogromnej przepustowości. To lata w dół od miejsca, w którym jesteś. NodeJS został zbudowany tak, aby był używany jak węzeł w systemie, to absolutne minimum potrzebne do zrobienia wszystkiego, co tylko chcesz. Nie jest to już gotowe rozwiązanie skalowalności, ale możesz zaprojektować z niego bardzo dobry system. – miketheprogrammer

8

Silnik JavaScript V8, który zasila węzeł jest w rzeczywistości pretty fast comparedto manyserver-side languages.

Problem polega na tym, że Węzłowy Model Zdarzeń jest bardzo podobny do cooperative multitasking - operacje określonego żądania będą kontynuowane, dopóki nie odda kontroli z powrotem do pętli zdarzeń JavaScript, więc wysokie zadania procesora spowodują zablokowanie pętli (co oznacza losowy wybór użytkownicy uzyskają doskonałą wydajność, a kolejna grupa otrzyma limity czasowe, a nie wydajność znikając z ładunkiem.

Tak, dla zadań obciążających procesor, istnieje kilka rozwiązań można użyć:

  1. Można traktować swój kod jak rurociąg przetwarzania i po prostu process.nextTick między znaczących kawałków przetwarzania w celu zmniejszenia średniego opóźnienia (przy jednoczesnym zwiększeniu bezwzględnego minimum), zasadniczo jest bardziej "kooperatywny" i nie pozwala żadnemu jednemu żądać na procesor przez długi czas.
  2. Jeśli twoja praca jest czysta Javascript (brak modułów węzła), możesz użyć biblioteki node-webworker-threads, aby odciążyć pracę z dużym obciążeniem procesora na wątki. Jednak ciągłe tworzenie nowych wątków jest prawdopodobnie złym pomysłem, więc prawdopodobnie będziesz potrzebować puli wątków, które robisz, do których ci pracownicy odciągają i wysyłają kolejkę wyjściową. W takim przypadku ...
  3. Tworzysz pulę podrzędnych procesów roboczych i używasz tego samego mechanizmu kolejkowania, w którym rozmiar puli zależy od% żądań, które wymagają ścieżki intensywnej procesora, łącznej liczby żądań i akceptowalnego opóźnienie wzrostu dozwolone dla tych żądań.
Powiązane problemy