Czy plik node.js nadaje się do przetwarzania w tle?


10

Powoli się uczę node.jsi mam mały projekt, który chcę rozpocząć. Projekt będzie miał wiele procesów w tle (pobieranie danych z zewnętrznych stron, parsowanie plików CSV itp.).

Dużą „wygraną” dla mnie i węzła jest fakt, że używa JavaScript zarówno dla klienta, jak i serwera. W swojej codziennej pracy koduję w Javie i JavaScript, ale jestem też całkiem dobra w Ruby.

Ale, jak powiedziałem, używanie jednego języka wszędzie wydaje się atrakcyjne, a JS wydaje się pasować do tego rachunku.

Jednak nie miałem dużego doświadczenia w używaniu JS do uruchamiania zadań w tle. Ruby wydaje się w tym przodować. I nie jestem przeciwny używaniu go. Więc co myślisz o przejściu w 100% na JS? Zdaję sobie sprawę, że bardzo duże projekty wymagają niestandardowych rozwiązań. Zastanawiam się tylko, czy warto. A może powinienem po prostu trzymać się Ruby przy tego rodzaju obowiązkach?

Docenione opinie.

Dzięki


Możesz także spojrzeć na vert.x jako alternatywę dla węzła.
Mike

Odpowiedzi:


13

Jest szczególnie skuteczny w obsłudze ton plików we / wy i spodziewałbym się, że dobrze poradzi sobie również z masą komunikacji sieciowej. Wydaje się szczególnie popularny w aplikacjach opartych na gniazdach. Ważną rzeczą do zapamiętania jest to, że jeśli twoje potrzeby nie są zaspokojone przez istniejące biblioteki (jest ich wiele), być może będziesz musiał zanurzyć się w jakimś C, które może być powiązane z poleceniami JS. Możesz także odrodzić dodatkowe procesy Węzłów, ale podejrzewam, że zrobienie wielu z nich może wymagać opodatkowania (zakładam - może się mylić - dla każdego z nich pojawia się instancja V8).

JS jest jednowątkowy i blokuje, co oznacza, że ​​nic innego nie może zostać wykonane do czasu zakończenia wywołania funkcji. To była pożądana cecha JS, polegająca na usunięciu wszystkich problemów związanych z wątkami i kolejkami z twoich rąk. JS nie powstrzymuje działania C / C ++ przed uruchomieniem w bardziej wielowątkowy sposób pod maską, więc rolą JS jest naprawdę większa architektura / komunikator. Jeśli przetwarzasz obraz, nie będziesz chciał obsługiwać go za pomocą synchronicznych poleceń JavaScript, ponieważ wszystko inne w Twojej aplikacji lub serwerze będzie blokowane, dopóki nie zostanie wykonane. Chodzi o to, że wywołujesz przetwarzanie obrazu przez powiązaną funkcjonalność C / C ++, a następnie reagujesz na zdarzenie „gotowe”, gdy obraz jest gotowy do przetworzenia.

Wymaga to, aby JS w dowolnej aplikacji Node.js był silnie sterowany zdarzeniami i wywołaniami zwrotnymi, lub prawdopodobnie będzie działał bardzo słabo. Więc nie zobaczysz wielu wywołań metod w Węźle, które nie otrzymają funkcji do późniejszego użycia. Jedną z rzeczy, która bardzo szybko staje się bardzo wyraźna w Node, jest to, że czeka cię świat brzydki, jeśli nie znajdziesz sposobu na obsłużenie piramidy zwrotnej. na przykład

//event CBs are more DOM-style than Node style and this isn't built-in Node file I/O
//keeping it simple and quick since I'll just get Node stuff wrong from memory
file.get('someFile.txt', function(e){
    e.fileObj.find('some snippet', function(e){
        someFinalCallBackHandler( e.snippetLocations );
    } );
} );

Na szczęście istnieje wiele narzędzi i przykładów pozwalających lepiej sobie z tym poradzić. Większość z nich obraca się wokół mechanizmów obiecujących i po prostu łączy szereg funkcji, które mają reagować na wzajemne stany zwrotne w tablicy, która robi dla ciebie brzydkie piramidy.

Osobiście, do cholery, uwielbiam, że mamy JS na wysokim poziomie i C / C ++ bliżej chrome. To najlepsza kombinacja, która zainspirowała mnie do rozpoczęcia nauki C. I nie pozwól, aby brak potencjału biblioteki Cię przeraził, dopóki nie przeprowadzisz badań. Biblioteki węzłów są tworzone w bardzo szybkim tempie i dojrzewają bardzo szybko. Jeśli nie robisz nic niezwykłego, szanse są dobre, ktoś ma to na uwadze.

Największa różnica w stosunku do Rails polega na tym, że JS nigdy nie będzie na szynach. Mamy tendencję do kodowania tego, aby móc go mieć tak szybko, jak chcesz, więc jest lina do powieszenia się z czynnikiem, a architektura była całkiem zrób to sam w JS do ostatnich lat. Nazywam tę wolność, ale zdaję sobie sprawę, że dla wielu deweloperów nie jest to idealne.

Ponadto nigdy nie będziesz mieć problemu z „klejnotem” w Node.js, ponieważ próbowałeś zainstalować na czymś innym niż Mac. Deweloperzy sieci Web po stronie klienta gardzą problemami związanymi z zależnościami i stąd pochodzi wiele rdzeni Node. Jeśli nie działa od razu po wyjęciu z pudełka w ciągu 5 minut lub krócej na każdej popularnej platformie, generalnie zgniatamy go i podrzucamy. Nie spotkałem się jeszcze z popularnym modułem, który wymagał, żebym zrobił coś specjalnego, aby go uruchomić. System pakietów jest doskonały.

Ale aby odpowiedzieć na podstawowe pytanie w sposób bardziej bezpośredni / zwięzły: czy jest to dobre w przypadku procesów w tle?

Tak, Węzeł jest po prostu procesem działającym w tle, umożliwiającym sterowanie aplikacją poprzez zdarzenia i wywołania zwrotne.


1
Jest tutaj wiele ogólnych informacji, ale nie powiedziałeś nic o zdolności node.js do obsługi żądań asynchronicznie.
Robert Harvey

Słuszna uwaga. Skupię się na tym.
Erik Reppen

Jako były programista Rails i pół doświadczony programista Node.js zdecydowanie nie zgadzam się z porównaniem systemu pakietów między światem Ruby / Rails a światem JS / Node.js stworzonym przez Erika. Każdy doświadczony (lub nawet nie doświadczony) twórca Railsów wie, że „klejnoty” są dosłownie jak klejnoty. Pracują bez wysiłku. Większość z nich jest dobrze przetestowana, solidna i stabilna. Jednak ponad połowa modułów NPM jest źle zaprojektowana, nie przetestowana, a nawet nieukończona. Na przykład nikt nie może mi pokazać zamienników JS Devise lub Paperclip z dokładnie taką samą jakością i bogactwem funkcji. Nie ma mowy.
straszny

To nie było moje doświadczenie na niczym innym niż Mac. To powiedziawszy, jestem mniej pod wrażeniem kompatybilności między typowymi modułami węzłów dla różnych systemów operacyjnych niż kiedyś. Nie jestem pewien, czy po prostu wpadłem na więcej złych jajek z doświadczeniem, czy też społeczność wzrosła do wielu deweloperów, którzy nie traktują różnych platform tak poważnie, jak powinni. Ale zdecydowanie jest tam trochę snobizmu na Linuksie.
Erik Reppen

Ta odpowiedź zasługuje na tak wiele pozytywnych opinii
Amin Mohamed Ajani

2

Jedną z kwestii, o których należy pamiętać, jest to, co dzieje się podczas przetwarzania dużych plików w środowisku asynchronicznym : jeśli strumień wejściowy (plik) jest szybszy niż strumień wyjściowy (db), nie będziesz w stanie szybko obsłużyć zdarzeń danych wejściowych wystarczająco. To albo przytłoczy część systemu (strumień wyjściowy lub pamięć), albo spowoduje utratę danych. Z tego powodu asynchroniczne przetwarzanie danych może być nieco trudne. Ale jak wyjaśniono w artykule, do którego podłączyłem, możliwość wstrzymania strumienia wejściowego umożliwia przepustnicę w sposób dostosowany do twojej sytuacji.


1

Node.js przoduje w IO. Jest mało prawdopodobne, aby pewnego dnia odkryć, że proces się zaciął, ponieważ większość wątków blokuje wywołania SQL.

Jednak node.js jest naprawdę kiepski w pracy związanej z obliczeniami. Kiedy słyszę „dużo IO”, myślę „tak! Przejdź do węzła!”, Ale kiedy słyszę „parsowanie”, waham się trochę. Nie jestem pewien, czy dzieje się tak z jakiegokolwiek powodu poza tym, że ludzie nie obsługują wielowątkowo węzła, ale jak dotąd cała praca związana z obliczeniami mojego produktu odbywa się poza węzłem.

Wielowątkowość w node.js jest trudna do skonfigurowania. Wszystko jest domyślnie jednowątkowe, a większość kodu jest napisana przy założeniu, że będzie działała tylko pod jednym wątkiem. Z pewnością będziesz musiał użyć domen, aby zapobiec wystąpieniu błędu w jednym wątku powodującym uszkodzenie całej aplikacji.

Należy również pamiętać, że węzeł może być nieco słabszy w niektórych możliwościach przedsiębiorstwa. Na przykład jego biblioteki rejestrowania nie są porównywane z bibliotekami Java. Obecnie nie ma dobrych ram rejestrowania, które wspierają i MDC, co w praktyce oznacza, że ​​możesz dużo zrobić var logPrefix = userId + ": ".

Nigdy też nie uruchomiłem prywatnego repozytorium npm, możesz potrzebować jednego z nich w zależności od tego, czy Twój kod jest zastrzeżony.


1

Jeśli procesy w tle mogą działać sekwencyjnie, może być całkiem niezłe. Na moim ostatnim stanowisku musiałem napisać wiele narzędzi do wstępnego przetwarzania, eksportu i tłumaczeń dla wielu źródeł danych. Korzystanie z NodeJS było bardzo proste.

Jeśli nie wykonujesz dużo przetwarzania związanego z obliczeniami, proste manipulowanie krótkimi łańcuchami i parsowanie liczb całkowitych nie jest takie złe, jeśli potrzebujesz manipulować obrazami, prawdopodobnie nie jest to najlepsze narzędzie (chociaż istnieją wywoływalne opakowania i moduły które mogą działać dobrze).

Porada, trzymaj się modułów, które używają strumieni. Może to ułatwić powiązanie przetwarzania z modułami dla tego konkretnego kroku. Jeśli spojrzeć na to, jak zdarzenie strumień jest wykorzystywany w haustem-jade do nawarstwiania narzędzia haustem , na przykład, można zobaczyć, jak to jest w stanie.

W przypadku CSV można użyć node-csv , który jest całkiem dobry w ustanawianiu podstawy do przesyłania strumieniowego rekordów do strumienia procesora.

W przypadku dużych plików XML, w których chcesz zrobić pojedynczy rekord naraz, przyjrzałbym się węzłowi halfstreamxml, który odczytuje Twój strumień XML za pomocą procesora SAX i wywołuje zdarzenia dla każdego węzła. Owinąłbym to w strumień do odczytu / zapisu, abyś mógł podnieść pożądane dopasowania. Wiele parserów obiektów xml w węźle będzie próbowało odczytać / parsować cały xml naraz, i na przykład 100mb xml, który staje się ogromny ... gdzie halfstreamxml będzie czytał jako strumień.

UWAGA: istnieją inne procesory, takie jak strumień xml, który będzie używał programu expat (biblioteka C) pod spodem, który może zapewnić większą wydajność, ale mniej przenośny bez środowiska kompilacji.

Ogólnie rzecz biorąc, korzystanie z ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.