node.jsはバックグラウンド処理に適していますか?


10

私はゆっくりと学習node.jsしていて、始めたい小さなプロジェクトがあります。プロジェクトには多くのバックグラウンドプロセス(外部サイトからのデータのダウンロード、CSVファイルの解析など)があります。

私とノードにとって大きな「勝利」は、クライアントとサーバーの両方にJavaScriptを使用していることです。私は日々の仕事でJavaとJavaScriptでコーディングしていますが、Rubyもかなり得意です。

しかし、私が言ったように、どこでも1つの言語を使用することは魅力的であり、JSはその法則に適合しているようです。

ただし、私はJSを使用してバックグラウンドジョブを実行する経験があまりありません。Rubyはこれに優れているようです。そして、私はそれを使うことに反対していません。では、これを100%JSにすることについてどう思いますか?非常に大きなプロジェクトにはカスタムソリューションが必要であることに気づきました。努力するだけの価値があるのか​​と思っています。それとも、そのような雑用にはRubyだけを使うべきでしょうか?

ご意見をお寄せください。

ありがとう


ノードの代わりにvert.xを確認することもできます。
マイク

回答:


13

これは特に大量のファイルI / Oを処理するのが得意であり、大量のネットワーク通信も適切に処理することが期待されます。ソケット駆動型アプリで特に人気があるようです。覚えておくべき重要なことは、既存のライブラリ(多くある)でニーズが満たされない場合は、JSコマンドにバインドできるCに飛び込む必要があるかもしれないということです。追加のノードプロセスを生成することもできますが、その多くを実行すると、負荷がかかる可能性があると思います(それぞれにV8インスタンスが生成されていると思います-間違っている可能性があります)。

JSはシングルスレッドでブロックされます。つまり、関数呼び出しが完了するまで、他に何も実行できません。これはJSの望ましい機能であり、基本的にすべてのスレッド化とキューイングの懸念を解消しました。JSは、C / C ++の要素が内部でよりマルチスレッドの方法で実行されることを妨げないため、JSの役割は、実際にはより多くのアーキテクチャー/メッセンジャーです。画像処理をしている場合は、同期JavaScriptコマンドでそれを処理する必要はありません。アプリケーションまたはサーバー上の他のすべてが完了するまでブロックされるためです。アイデアは、バインドされたC / C ++機能によって処理される画像を要求し、画像の処理が完了したときに「完了」イベントに応答することです。

これには、任意のNode.jsアプリのJSがイベントとコールバックに大きく依存する必要があります。そうしないと、パフォーマンスが非常に低下する可能性があります。したがって、後で使用するために関数を渡されないNodeのメソッド呼び出しは多くありません。Nodeで非常に速く明らかになることの1つは、コールバックピラミッドを処理する方法を見つけなければ醜い世界にいるということです。例えば

//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 );
    } );
} );

幸いなことに、これをよりよく処理するためのツールや例がたくさんあります。ほとんどの場合、promiseメカニズムを中心に展開し、一連の関数を単純にチェーン化して、内部で醜いピラミッドを実行する配列で相互のコールバック状態に応答することを目的としています。

個人的には、ハイレベルのJSとC / C ++をクロームに近づけることが大好きです。これは究極のコンボであり、Cの学習を始めるきっかけになりました。さらに、いくつかの調査を行うまで、ライブラリの欠如の可能性に驚かされないようにしてください。ノードライブラリは非常に速いペースで作成されており、非常に急速に成熟しています。あなたが何もしていなければ、非常に珍しいオッズは誰かがそれをカバーしているのは良いことです。

Railsとの最大の違いは、JSが以前のようにRailsになる可能性が低いことです。私たちはそれを手に入れることができるようにコーディングする傾向がありますが、あなたはそれを非常に迅速に望んでいるので、要因で自分自身をぶら下げるロープがあり、アーキテクチャはより最近までJSでかなりDIYでした。私はそれを自由と呼んでいますが、それは多くの開発者にとって理想的とは見なされていません。

また、Mac以外のものにインストールしようとしたため、Node.jsで「gem」の問題が発生することは決してありません。クライアント側のウェブ開発者は依存関係の問題を軽視し、そこから多くのノードのコアが生まれています。人気のあるすべてのプラットフォームで5分以内に箱から出してすぐに機能しない場合は、通常、それをくしゃくしゃにして投げます。私はそれを機能させるために特別なことをする必要がある人気のあるモジュールにまだ遭遇していません。パッケージシステムは、優れています。

しかし、あなたの核となる質問に、より明確に/簡潔に答えるにバックグラウンドプロセスで良いですか?

はい。Nodeは基本的に、イベントとコールバックを介してアプリを駆動する手段を備えたバックグラウンドプロセスです。


1
ここには多くの一般情報がありますが、node.jsのリクエストを非同期で処理する機能については何も述べていません。
ロバートハーベイ

いい視点ね。もう少し焦点を当てます。
Erik Reppen 2013

以前のRails開発者であり、ある程度経験のあるNode.js開発者である私は、Ruby / Railsの世界とErikが作成したJS / Node.jsの世界のパッケージシステムの比較に完全に同意しません。経験のある(または経験のない)Rails開発者なら誰でも、「宝石」は文字通り宝石のようであることを知っています。彼らは楽に働きます。それらのほとんどは十分にテストされ、堅牢で安定しています。ただし、NPMモジュールの半分以上は設計が不十分で、テストも完了もしていません。たとえば、まったく同じ品質と豊富な機能を備えたDeviseまたはPaperclipのJSの代替品を私に見せることはできません。ありえない。
scaryguy 2015

それはMac以外の私の経験ではありません。とは言っても、典型的なノードモジュールのOS間の互換性には、以前ほど感心していません。経験を積んでより悪い卵に遭遇しただけなのか、それともコミュニティがクロスプラットフォームを真剣に受け止めていない開発者をたくさん含むようになったのかわかりません。しかし、確かにLinuxの俗物がいくつかあります。
Erik Reppen、2015

この回答は多くの賛成票に値します
アミンモハメドアジャニ

2

注意すべき1つの問題は、非同期環境で大きなファイルを処理するときに何が発生するかです。入力ストリーム(ファイル)が出力ストリーム(db)より速い場合、入力データイベントをすばやく処理できません。足りる。これは、システムの一部(出力ストリームまたはメモリ)を圧倒するか、データを失う原因になります。このため、非同期でのデータ処理は少し注意が必要です。しかし、私がリンクした記事で説明されているように、入力ストリームを一時停止する機能により、状況に合った方法でスロットルすることができます。


1

Node.jsはIOに優れています。ほとんどのスレッドがSQL呼び出しでブロックされているため、ある日プロセスが停止したことを発見することはほとんどありません。

しかし、Node.jsの本当に悪いコンピュートバウンド仕事で。「たくさんのIO」と聞くと「ええ!ノードに行く!」と思いますが、「構文解析」と聞くと少し迷います。ノードが適切にマルチスレッド化されていないことを除いて、これが何らかの理由であるかどうかはわかりませんが、これまでのところ、私の製品のすべての計算処理はノードの外部で行われています。

node.jsのマルチスレッドは、正しく設定するのが難しいです。デフォルトではすべてがシングルスレッドであり、ほとんどのコードは1つのスレッドでのみ実行されるという想定の下に記述されています。1つのスレッドのエラーによってアプリケーション全体が停止するのを防ぐために、ドメインを使用する必要があります。

また、一部のエンタープライズ機能ではノードが少し弱い場合があることにも注意してください。たとえば、そのロギングライブラリはJavaと比較されません。現在、MDCもサポートする優れたロギングフレームワークはありません。これは、実際には多くのことを実行できることを意味しますvar logPrefix = userId + ": "

また、私はプライベートnpmリポジトリを実行したことがありません。コードがプロプライエタリかどうかによって、これらのいずれかが必要になる場合があります。


1

バックグラウンドプロセスが連続して実行できる場合は、かなり良い場合があります。私の最後のポジションでは、多くのデータソース用にいくつかのプリプロセッサ、エクスポート、および変換ユーティリティを作成する必要がありました。ここでは、NodeJSを簡単に使用できました。

あなたは行っていない場合は多く、短い文字列の簡単な操作を計算バウンドの処理を、整数の解析はそれほど悪いわけではない、あなたが画像を操作する必要がある場合に呼び出し可能ラッパーとモジュールがありますが、それはおそらく最良のツール(ではありませんそれはうまくいくことができます)。

アドバイス、ストリームを使用するモジュールに固執する。これにより、処理をその特定のステップのモジュールにパイプすることが容易になります。たとえば、gulp-jadegulpビルドツールのevent-streamがどのように使用されているかを見ると、それがいかに優れているかがわかります。

CSVの場合、node-csvを使用できます。これは、レコードをプロセッサストリームにパイプするためのベースを確立するのに非常に適しています。

大規模なXMLの場合、一度に1つのレコードを実行する場合、SAXプロセッサを使用してXMLストリームを読み取り、各ノードのイベントを発生させるnode-halfstreamxmlを調べます。私はそれを読み取り/書き込みストリームにラップして、希望の一致を上げることができるようにします。ノード内の多くのxml-objectパーサーは、一度にxml全体の読み取り/解析を試みます。たとえば、100mbのxmlが巨大になる...ここでhalfstreamxmlはストリームとして読み取られます。

注:下にexpat(Cライブラリ)を使用するxml-streamのような他のプロセッサがあります。これにより、パフォーマンスは向上しますが、ビルド環境がないと移植性が低下します。

一般的に、それを使用することは本当に喜びです...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.