Node.jsをいつ使用するかを決める方法は?


2195

私はこの種のものに不慣れですが、最近Node.jsがいかに優れているかについて多くを聞いています。一般的にjQueryとJavaScriptの操作がどれほど好きかを考えると、Node.jsをいつ使用するかを決定する方法を考えざるを得ません。私が考えているWebアプリケーションはBitlyのようなものです -いくつかのコンテンツを取り、それをアーカイブします。

ここ数日間の宿題から、次の情報が得られました。Node.js

  • 通常のWebサーバーとして実行できるコマンドラインツールで、JavaScriptプログラムを実行できます
  • 優れたV8 JavaScriptエンジンを利用
  • 同時にいくつかのことを行う必要がある場合は非常に良いです
  • イベントベースなので、素晴らしいAjaxはすべて似サーバー側で実行できます
  • ブラウザとバックエンドの間でコードを共有できます
  • MySQLと話しましょう

私が出会ったいくつかの情報源は次のとおりです。

Node.jsはAmazonのEC2インスタンスでほとんどそのまま実行できることを考慮して、PHPPythonRubyなどの強力な王とは対照的に、Node.jsが必要な問題の種類を理解しようとしています。。私はそれが言語に関する専門知識に本当に依存することを理解していますが、私の質問はより一般的なカテゴリに分類されます。


4
この質問はメタ(meta.stackoverflow.com/q/332386/497418)で議論されています。
zzzzBov 2016

回答:


1355

Node.jsのすごいところを要約する素晴らしい仕事をしました。Node.jsは、ブラウザーからサーバーへの永続的な接続を維持したいアプリケーションに特に適していると感じています。「ロングポーリング」と呼ばれる手法を使用して、更新をユーザーにリアルタイムで送信するアプリケーションを作成できます。Ruby on RailsDjangoなど、多くのWebの巨人に対して長いポーリングを行うと、アクティブなクライアントごとに1つのサーバープロセスが消費されるため、サーバーに大きな負荷がかかります。この状況は、ターピット攻撃に相当します。Node.jsのようなものを使用する場合、サーバーは開いている接続ごとに個別のスレッドを維持する必要はありません。

つまり、非常に多くのクライアントにサービスを提供するためにシステムリソースをほとんど必要としない、ブラウザベースのチャットアプリケーションをNode.jsで作成できます。この種のロングポーリングを実行したい場合はいつでも、Node.jsは優れたオプションです。

RubyとPythonの両方にこの種のことを行うためのツール(それぞれeventmachinetwisted)があることは言及する価値がありますが、Node.jsはそれを非常にうまく、ゼロから実行します。JavaScriptは、コールバックベースの同時実行モデルに非常に適しているため、ここで優れています。また、クライアントとサーバーの両方にネイティブなJSONを使用してシリアライズおよびデシリアライズできることは、かなり気の利いた方法です。

ここで他の回答を読むのを楽しみにしています。これは素晴らしい質問です。

Node.jsは、クライアント/サーバーのギャップを越えて多くのコードを再利用する状況にも最適であることを指摘する価値があります。流星のフレームワーク、これは本当に簡単になり、そして多くの人々が、これはWeb開発の未来であるかもしれない示唆しています。経験から言うと、Meteorでコードを書くのはとても楽しいことです。これの大部分は、データを再構築する方法を考える時間を短縮することであり、ブラウザーで実行されるコードは簡単に実行できます。それを操作して戻します。

Pyramidとロングポーリングに関する記事は次のとおりです。geventの助けを借りれば、セットアップが非常に簡単であることがわかります。TicTacToeとLong Polling with Pyramidです。


12
はい。node.jsは、ブラウザからサーバーへの永続的な接続を必要とするアプリケーションに特に適していると考えることが非常に重要だと思います。-チャットプログラムやインタラクティブゲームなどユーザー/サーバーとの通信を必ずしも必要としないアプリケーションを構築しているだけなら、他のフレームワークでの開発は問題なく、はるかに少ない時間で済みます。
user482594 2011

1
このおかげで...素晴らしいQとA ;-)フロントエンドとバックエンドの両方の開発に使用できる1つの優れたテクノロジーを
いくつかの

12
ロングポーリングを使用する理由 未来とソケットはどうなりましたか?
hitautodestruct 2016

1
私の短い答えはバックグラウンドプロセスです。リクエストとレスポンス(rest APIを含む)はすべて、他の言語とサーバーで実現できます。ノードでWebプロジェクトを変換することを考えている人のために。同じことをもう一度考えてください!...主にイベント指向しているプロセスを、IMAP、画像処理、クラウドへのアップロードファイル、または任意の長いとのメールを読んだり、終わることがないように、バックグラウンド・プロセスとしてノードを使用してください
ヴィカス

409

Node.jsはリアルタイムアプリケーションに最適であると思います。オンラインゲーム、コラボレーションツール、チャットルーム、または1人のユーザー(またはロボット?センサー?)がアプリケーションで行うことを他のユーザーがすぐに見られる必要があるものは、ページの更新なし。

Node.jsと組み合わせたSocket.IOは、ロングポーリングで可能なものよりもさらにリアルタイムレイテンシを削減することにも言及する必要があります。Socket.IOは最悪のシナリオとしてロングポーリングにフォールバックし、代わりにWebソケットを使用するか、フラッシュがあればそれを使用します。

ただし、スレッドが原因でコードがブロックされる可能性があるすべての状況について、Node.jsでより適切に対処できることにも触れておきます。または、アプリケーションをイベント駆動型にする必要がある状況。

また、Ryan Dahlは、私がかつて出席したある講演で、Node.jsベンチマークは通常の古いHTTPリクエストに対してNginxに匹敵するものであると述べました。したがって、Node.jsを使用して構築した場合、通常のリソースを非常に効果的に提供でき、イベント駆動型のものが必要な場合は、処理する準備ができています。

さらに、常にJavaScriptです。スタック全体のLingua Franca。


17
.Netとノードを切り替える誰かからの単なる観察です。システムのさまざまな領域のさまざまな言語は、コンテキスト切り替えの際に非常に役立ちます。Javascriptを表示しているときは、クライアントで作業しています。C#は、アプリケーションサーバー、SQL =データベースを意味します。全体を通してJavaScriptで作業していると、レイヤーが混乱するか、単にコンテキストスイッチに時間がかかるようになりました。これは、終日.NETスタックで作業し、夜にNodingで作業することによるアーティファクトのようですが、違いはあります。
マイケルブラックバーン

9
興味深いことに、異文化の個人が主流の文化とネイティブの文化との間を移動するときに方言を切り替える習慣は、「コード切り替え」と呼ばれています。
マイケルブラックバーン

1
先日、.jsどういうわけか私が異なるファイルに異なる色を割り当てる方法を考えていました。クライアント側は緑、サーバー側は青。私は「迷子」になり続けています。
AJB 2015

209

NodeJSを使用する理由:

  • これはJavascriptを実行するため、サーバーとクライアントで同じ言語を使用でき、それらの間でコードを共有することもできます(たとえば、フォームの検証、または両端でビューをレンダリングするため)。

  • シングルスレッド化イベント駆動型システムがあり、高速伝統的なマルチスレッドに比べて、一度にたくさんのリクエストを処理する際にも、また、簡単なJavaのか、RORフレームワーク。

  • クライアントおよびサーバー側のライブラリー/モジュール、およびWeb開発用のコマンドラインツールを含む、NPM介してアクセスできる増え続けるパッケージのプール。これらのほとんどはgithubでホストされており、問題を報告して数時間以内に修正されることがあります。標準化された問題報告と簡単な分岐により、すべてを1つの屋根の下に置くのは素晴らしいことです。

  • これは、JavaScriptに関連するツールや、タスクランナー、縮小機能、美化機能、リンター、プリプロセッサー、バンドル機能、分析プロセッサーなどのその他のWeb 関連ツールを実行するための事実上の標準環境になっています。

  • プロトタイピング、アジャイル開発、製品の迅速な反復に非常に適しているようです。

NodeJSを使用しない理由:

  • これは、コンパイル時の型チェックを行わないJavaScriptを実行します。大規模で複雑な安全上重要なシステム、または異なる組織間のコラボレーションを含むプロジェクトの場合、契約上のインターフェースを奨励し、静的型チェックを提供する言語を使用すると、長期的にはデバッグ時間(および爆発)を節約できます。(JVMはで動かなくなっていnullますが、原子炉にはHaskellを使用してください。)

  • それに加えて、NPMのパッケージの多くは少し未加工で、まだ急速に開発中です。古いフレームワークの一部のライブラリは、10年間のテストとバグ修正を経ており、現在までに非常に安定しています。Npmjs.orgにはパッケージを評価するメカニズムがありません。これにより、多かれ少なかれ同じことを行うパッケージが急増し、その中から大きな割合が維持されなくなります。

  • ネストされたコールバック地獄。(もちろんこれには20の異なる解決策があります...)

  • 増え続けるパッケージのプールにより、1つのNodeJSプロジェクトが次のプロジェクトと根本的に異なるように見える可能性があります。利用可能なオプションの数が非常に多いため、実装には大きな多様性があります(例:Express / Sails.js / Meteor / Derby)。これにより、新規開発者がNodeプロジェクトに参加することが困難になる場合があります。それと対照的に、Rails開発者は既存のプロジェクトに参加しています。すべてのRailsアプリは同様の構造を使用することが推奨されているため、アプリにすぐに慣れるはずです。

  • ファイルの扱いは少し面倒な場合があります。テキストファイルから1行を読み取るなど、他の言語では取るに足らないことは、80以上の賛成票でStackOverflowの質問があるというNode.js行うに奇妙です。CSVファイルから一度に1つのレコードを読み取る簡単な方法はありません。等。

私はNodeJSが大好きです。速くてワイルドで楽しいですが、証明可能な正確さにほとんど関心がないのではないかと心配しています。最終的に両方の世界の最高のものをマージできることを願っています。私は将来Nodeを置き換えるものを見たいと思っています... :)


1
@naneはい、私は彼らがその問題に対処できると思いますが、タイプセーフ言語で書かれたライブラリのみを使用するように制限するか、すべてのコードベースが静的に型付けされいるわけではないことを受け入れる必要があります。ただし、1つの議論があります。言語に関係なくコードの適切なテストを作成する必要があるため、動的に型付けされたコードでも信頼水準は等しくなるはずです。その議論を受け入れると、強い型付けの利点は、開発/デバッグの時間、証明可能性、および最適化の支援にまで減少します。
joeytwiddle 2015

1
@kervin、私はいくつかのベンチマークが素晴らしいだろうことに同意しますが、私がオンラインで見つけられるものに失望しました。.NETのパフォーマンスはノードのパフォーマンスに匹敵すると主張する人もいますが、実際に何をしているのかが重要です。ノードは、多くの同時接続で小さなメッセージを配信するのに優れているかもしれませんが、重い数学計算にはそれほど優れていません。パフォーマンスを適切に比較するには、さまざまな状況をテストする必要があります。
joeytwiddle

2
@joeytwiddleは、TypescriptのようなものがNode.jsを助け、大規模で複雑なプログラムや静的型チェックを処理することになりますか?
CodeMonkey

2
@joeytwiddleの価値については、stillmaintained.comを使用して、npmパッケージがまだ維持されているかどうかを判断できます(大部分はgithubにあるため)。また、npm searchそしてnpm showあなたのパッケージの最後のリリースの日付が表示されます。
Dan Pantry、2015年

3
レールとノードを比較すると、プラットフォームとフレームワークが混同されます。RailsはSailsと同じようにRubyのフレームワークであり、meteorはJavaScriptのフレームワークです。
BonsaiOak 2016

206

短くするには:

Node.jsは、多数の同時接続があり、関数の実行中にイベントループ(他のすべてのクライアントとの)がブロックされるため、各要求に必要なCPUサイクルが非常に少ないアプリケーションに適しています。

Node.jsのイベントループに関する優れた記事は、Mixuの技術ブログ「node.jsイベントループを理解する」です。


127

Node.jsを使用した実際の例があります。私が働いている会社には、単純な静的HTML Webサイトを作成したいクライアントが1人いました。このWebサイトは、PayPalを使用して1つの商品を販売するためのものであり、クライアントは、販売された商品の量を示すカウンターも必要としています。クライアントは、このWebサイトに大量の訪問者がいることを期待しています。Node.jsとExpress.jsを使用してカウンターを作成することにしましたフレームワーク。

Node.jsアプリケーションはシンプルでした。Redisデータベースから販売済みアイテムの金額を取得し、アイテムが販売されたときにカウンターを増やし、APIを介してユーザーにカウンター値を提供します

この場合にNode.jsを選択した理由

  1. それは非常に軽量で高速です。3週間でこのWebサイトに200000以上の訪問があり、最小限のサーバーリソースですべてを処理できました。
  2. カウンターはリアルタイムにするのが本当に簡単です。
  3. Node.jsは簡単に構成できました。
  4. 無料で利用できるモジュールがたくさんあります。たとえば、PayPal用のNode.jsモジュールを見つけました。

この場合、Node.jsは素晴らしい選択でした。


7
そのようなものをどのようにホストしますか?次に、運用サーバーでnodejsをセットアップする必要がありますか?Linuxでは?
ミゲルスティーブンス

1
nodejitsuやHerokuなどのPaaSがいくつかあります。または、実際にLinuxボックスでnodejsを設定することもできます(例:amazon ec2から)。参照:lauradhamilton.com/...
ハリー若い

13
1,814,400秒以内に200,000回の訪問。まったく関係ありません。bashでさえ、最も遅いサーバーで、その多くの要求に対応できます。スクラッチサーバー。最も遅いVM。
Tiberiu-Ionuț Stan 2016

105

Nodeを使用して次のプロジェクトを開始する最も重要な理由...

  • すべてのクールな男がそれに入っている...だからそれする必要があります楽しいん。
  • より涼しい場所でたむろしたり、自慢するノードアドベンチャーをたくさん持つことができます。
  • クラウドホスティングコストに関しては、あなたは一銭のピンチです。
  • Railsでそれを実現
  • IISの展開が嫌い
  • あなたの古いITの仕事はかなり鈍くなっていて、あなたはあなたが輝く新しいスタートアップにいたらいいのにと思っています。

何を期待します ...

  • Expressがあれば、必要のないサーバーブロートウェアがなくても、安全で安心できるでしょう。
  • ロケットのように走り、スケールします。
  • あなたはそれを夢見る。インストールしました。ノードパッケージrepo npmjs.orgは、オープンソースライブラリの世界最大のエコシステムです。
  • ネストされたコールバックの土地であなたの脳は時間をゆがめられます...
  • ...あなたがあなたの約束を守ることを学ぶまで。
  • SequelizePassportは、新しいAPIの友達です。
  • ほとんど非同期コードをデバッグすると、うーん... 興味深いものになります。
  • マスターへのすべてのNodersの時間活字体

誰が使うの?


18
はい、私は伝統的な方法でこの質問に答えることができました。私はそうする資格があると思いますが、そのほとんどはすでに言われており、軽い心の楽しさは単調さを壊すだろうと思いました。他の質問については、技術的な回答を定期的に投稿しています。
トニー・オハガン、2014年

1
ネストされたコールバックは、非同期コードにES6ジェネレーターを使用することで回避できます
2016年

1
@CleanCrispCode:はい、確かに!ES6は、C#のスタイルを採用していますasync/ awaitので、今、我々はまた、伝統的なサポートノードコード非同期非常にクリーンロールアウトすることができますtry/をcatch。2016/17年に、JSコーダーはES6に切り替えられます。
Tony O'Hagan、2016年

1
これは1万倍です。「不要なサーバーブロートウェアがなくても、Expressを使えば安全で安心できます」
Simone Poggi

60

Silver Bulletに勝るものはありません。すべてに関連するいくつかのコストが伴います。油っこいものを食べると健康が損なわれ、油っぽいもののようなスパイスが入っていない健康食品です。彼らが彼らの食物のように健康またはスパイスを欲するかどうかは個人の選択です。Node.jsが特定のシナリオでの使用を検討するのと同じ方法。アプリがそのシナリオに当てはまらない場合は、アプリ開発のためにそれを考慮すべきではありません。私は同じことを考えています:

Node.JSを使用する場合

  1. サーバー側のコードが必要とするCPUサイクルが非常に少ない場合。他の世界では、あなたは非ブロッキング操作を行っており、大量のCPUサイクルを消費する重いアルゴリズム/ジョブを持っていません。
  2. あなたがJavaScriptのバックグラウンドから来ていて、クライアントサイドJSのようにシングルスレッドコードを書くことに慣れているなら。

Node.JSを使用しない場合

  1. サーバー要求は、CPUを大量に消費するアルゴリズム/ジョブに依存しています。

Node.JSでのスケーラビリティに関する考慮事項

  1. Node.JS自体は、基盤となるシステムのすべてのコアを利用するのではなく、デフォルトでシングルスレッドです。マルチコアプロセッサを利用してマルチスレッドにするには、独自のロジックを作成する必要があります。

Node.JSの代替

Node.JSの代わりに使用する他のオプションがありますが、Vert.xはかなり有望であるようで、ポリゴットやより優れたスケーラビリティの考慮事項などの追加機能がたくさんあります。


24
「サーバー側のリクエストに、ファイルIOやソケットIOなどのブロッキング操作が含まれている場合」が「使用しない場合」にリストされているかどうかはわかりません。私の理解が正しければ、node.jsの長所の1つは、ブロックせずにIOを処理する強力な非同期手段があることです。したがって、Node.jsはIOをブロックするための「治療法」と見なすことができます。
Ondrej Peterka 2013年

3
@OndraPeterka:Node.jsがサーバーIOをブロックすることで治癒するのは正しいですが、サーバー自体のリクエストハンドラーが他のWebサービス/ファイルオペレーションへのブロック呼び出しを行っている場合、Node.jsはここでは役に立ちません。サーバーへの着信リクエストに対してのみ非ブロッキングIOであり、アプリのリクエストハンドラーからの発信リクエストに対してはありません。
Ajay Tiwari 2013年

4
@ajay nodejs.org彼らは「非ブロックI / O」と言うが、あなたの「NOT」2と3を確認してください
オマール・アル・Ithawi

5
現在のバージョンでは、ノードは実際にはクラスターを使用してマルチコアサポートをサポートしています。これにより、Nodeアプリのパフォーマンスが少なくとも2倍向上します。ただし、クラスターlibを安定させると、パフォーマンスは2倍以上になるはずです。
ナム・グエン

4
重い計算にはnode.jsを使用できます。を使用しforkます。stackoverflow.com/questions/9546225/…を参照してください。ノードはclusterモジュールで複数のコアを非常にうまく処理します。 nodejs.org/api/cluster.html
Jess

41

Node.jsについて誰も言及しなかったと思うもう1つの素晴らしいことは、驚くべきコミュニティ、パッケージ管理システム(npm)、およびpackage.jsonファイルに単に含めることで含めることができる存在するモジュールの量です。


6
そして、これらのパッケージはすべて比較的新しいため、後知恵の利点があり、最近のWeb標準に準拠する傾向があります。
joeytwiddle 2013

3
当然のことながら、npmにはパッケージを評価するメカニズムがないため、npm上の多くのパッケージはひどいものです。CPANの知恵は誰か?
Dan Dascalescu 2014

残念ながら、どのWebsocketsライブラリもrfc 6455仕様を満たすことができません。node.jsのファンボーイは、この事実が与えられると、耳が聞こえず、頭がおかしく、盲目になります。
r3wt 2014

1
コメントをいつ付けたのかはわかりませんが、現時点では、wsライブラリがその仕様をサポートしています
Jonathan Gray

37

私の作品:nodejsは、分析、チャットアプリ、API、広告サーバーなどのリアルタイムシステムを作成するのに最適です。地獄、私は最初のチャットアプリをnodejsとsocket.ioを使用して2時間以内に作成しました。

編集する

nodejsを使い始めてから数年が経ち、静的ファイルサーバー、シンプルな分析、チャットアプリなど、さまざまなものを作成するのに使用しました。これは、nodejsを使用するときの私の考えです

いつ使うか

並行性とスピードを重視したシステムを作る場合。

  • チャットアプリ、ircアプリなどのサーバーのみをソケットします。
  • 地理位置情報、ビデオストリーム、オーディオストリームなどのリアルタイムリソースに重点を置くソーシャルネットワーク
  • 分析ウェブアプリのように、データの小さなチャンクを非常に高速に処理します。
  • RESTのみのAPIを公開する。

使用しない場合

非常に用途の広いウェブサーバーなので、好きな場所で使用できますが、おそらくこれらの場所では使用できません。

  • シンプルなブログと静的なサイト。
  • 静的ファイルサーバーと同じです。

私はつまらないことを覚えておいてください。静的ファイルサーバーの場合、Apacheは主に広く利用できるため、より優れています。nodejsコミュニティーは長年にわたって大きくなり、成熟してきました。自分でホスティングを選択できれば、nodejsはどこでも使用できると言っても過言ではありません。


シンプルなブログでもNode.jsのメリットを享受できます。静的ファイルを提供するために、引き続きNode.jsを使用できます。負荷が増加した場合は、現在のベストプラクティスに従って、Nginxリバースプロキシをその前に追加するだけです。Apache httpdサーバーは死にかけている恐竜です- このNetcraft調査を参照してください。
Endrju

そうでないと私は言うでしょう-ghost.orgを見てください。見栄えがよく、NodeJの上に構築されています-コラボレーション、リアルタイムの記事編集。また、使用して言う、NodeJsで簡単なページを作成sailsjs.orgを、簡単で、迅速かつあなたは、サーバー側のプログラミング言語のいずれかを学んで自分を気にする必要はありません
Bery

30

それは場所で使用することができます

  • イベント駆動型であり、I / Oの負荷が高いアプリケーション
  • 他のシステムへの多数の接続を処理するアプリケーション
  • リアルタイムアプリケーション(Node.jsは、リアルタイムで使いやすいようにゼロから設計されました。)
  • 他のソースとの間でストリーミングされる情報のカスケードを調整するアプリケーション
  • 高トラフィック、スケーラブルなアプリケーション
  • 多くのデータ分析を行わなくても、プラットフォームAPIとデータベースと通信する必要があるモバイルアプリ
  • ネットワークアプリケーションを構築する
  • バックエンドと頻繁に通信する必要があるアプリケーション

モバイル分野では、プライムタイム企業はモバイルソリューションをNode.jsに依存しています。理由を確認してください。

LinkedInは著名なユーザーです。モバイルスタック全体がNode.js上に構築されています。物理マシンごとに15個のインスタンスを持つ15台のサーバーを実行していたところから、わずか4個のインスタンスになり、2倍のトラフィックを処理できるようになりました。

eBayは、ランタイムスタックとしてNode.jsを使用するHTTP APIのWebクエリ言語であるql.ioをリリースしました。通常の開発者品質のUbuntuワークステーションを調整して、node.jsプロセスごとに120,000を超えるアクティブな接続を処理し、各接続で約2kBのメモリを消費することができました。

WalmartはNode.jsを使用するようにモバイルアプリを再設計し、JavaScript処理をサーバーにプッシュしました。

詳しくは、http//www.pixelatingbits.com/a-closer-look-at-mobile-app-development-with-node-js/をご覧ください。


20

同時リクエスト処理に最適なノード-

それでは、ストーリーから始めましょう。過去2年間から、JavaScriptの開発とWebフロントエンドの開発を行っており、楽しんでいます。バックエンドの連中はJava、Pythonで書かれたいくつかのAPI(私たちは気にしない)を提供し、AJAX呼び出しを作成してデータを取得し、何を推測しますか?完了です。しかし、実際にはそれほど簡単ではありません。取得しているデータが正しくない場合、またはサーバーエラーが発生している場合は、スタックして、メールまたはチャットでバックエンドの担当者に連絡する必要があります(whatsAppの場合もある:))。かっこよくありません。JavaScriptでAPIを記述し、フロントエンドからそれらのAPIを呼び出すとどうなりますか?はい。APIで問題が発生した場合は調査できるので、それはかなりすばらしいことです。何だと思う !あなたは今これを行うことができます、どうやって?–ノードはあなたのためにあります。

JavaScriptでAPIを記述できることに同意しましたが、上記の問題で大丈夫な場合はどうでしょうか。残りのAPIにノードを使用する他の理由はありますか?

これが魔法の始まりです。はい、APIにnodeを使用する他の理由があります。

ブロック操作またはスレッド化に基づいた従来のREST APIシステムに戻りましょう。2つの同時要求(r1とr2)が発生し、それぞれにデータベース操作が必要であるとします。したがって、従来のシステムではどうなるでしょうか。

1. Waiting Way:サーバーがr1リクエストの処理を開始し、クエリの応答を待ちます。の完了後r1、サーバーはサービスr2を開始し、同じように処理します。時間があまりないので、待つことは良い考えではありません。

2.スレッド化方法:サーバーは両方のリクエストに対して2つのスレッドを作成しますr1と、r2あなたは、両方の要求が同じデータを照会しているときに我々はまた、問題が増加二つのスレッドを開始見ることができるので、それはメモリを消費するそのfast.Butを冷却し、データベースを照会した後、自分の目的を果たします次に、デッドロックの種類の問題に対処する必要があります。したがって、待機方法よりも優れていますが、まだ問題があります。

これが、ノードがそれを行う方法です:

3.ノードウェイ:同じ同時リクエストがノードに着信すると、コールバックにイベントを登録し、特定のr1リクエストに対するクエリの応答を待ちません。リクエストが着信すると、ノードのイベントループ(イベントループがあります)この目的を果たすノードで。)そのコールバック関数でイベントを登録し、r2リクエストの処理に進み、同様にそのイベントをそのコールバックで登録します。クエリが完了するたびに、対応するイベントがトリガーされ、コールバックが中断されることなく完了するまで実行されます。

したがって、待機、スレッド化、メモリ消費はありません。これは、残りのAPIを提供するためのノードウェイです。


1
こんにちはAnshul。スレッド化の方法でデッドロックがどのように発生するかについて、いくつかのリソースを詳しく説明または提案できますか?
jsbisht 2015年

16

私のもう一つの理由新しいプロジェクトのためのNode.jsを選択するには、次のとおりです。

純粋なクラウドベースの開発を行うことができる

私はしばらくCloud9 IDEを使用してましたが、今ではそれなしでは想像できません。それはすべての開発ライフサイクルをカバーしています。必要なのはブラウザだけで、いつでもどこでもどのデバイスでもコーディングできます。1つのコンピューター(自宅など)でコードをチェックインしてから、別のコンピューター(職場など)でチェックアウトする必要はありません。

もちろん、他の言語やプラットフォーム用のクラウドベースのIDEもあるかもしれません(Cloud 9 IDEは他の言語のサポートも追加しています)が、Cloud 9を使用してNode.js開発を行うのは本当に素晴らしい経験です。


1
実際、Cloud9 IDEやその他(私が使用するものをコーディング)は、ほぼすべての種類のWeb言語をサポートしています。
Wanny Miarelli、2015

7
あなたは深刻な男ですか?これはスタックを選択するための基準ですか?:)それがあなたのために働いていることを嬉しく思います!
matanster 2015年

15

ノードが提供するもう1つのことは、オンザフライでノードの子プロセス(childProcess.fork()がドキュメントごとに10MBのメモリを必要とするを使用してノードの複数のv8インスタンスを作成できるため、サーバーを実行しているメインプロセスに影響を与えません。したがって、サーバーに大きな負荷がかかるバックグラウンドジョブをオフロードすると、子供の遊びとなり、必要に応じて簡単に強制終了できます。

私はノードを頻繁に使用しており、私たちが構築するほとんどのアプリでは、同時にサーバー接続を必要とするため、ネットワークトラフィックが大きくなります。Express.jsおよび新しいKoajs(コールバック地獄を削除)のようなフレームワークにより、ノードでの作業がさらに簡単になりました。


15

アスベスト・ロングジョンズの着用...

昨日、Packt Publications、JavaScriptを使用したリアクティブプログラミングでの私のタイトル。これは実際にはNode.js中心のタイトルではありません。初期の章は理論をカバーすることを目的としており、後半のコードが多い章は実践をカバーしています。私は読者にウェブサーバーを提供し損なうのは適切だとは本当に思っていなかったので、Node.jsははるかに明らかに明白な選択の。ケースは開かれる前に閉じられました。

Node.jsでの私の経験の非常にバラ色のビューを与えることができたでしょう。代わりに、私が遭遇した良い点と悪い点について正直でした。

ここに関連するいくつかの引用を含めましょう:

警告:Node.jsとそのエコシステムは高温になっています。

私が数学の教師の助手だったとき、私に言われた自明ではない提案の1つは、何かが「簡単」であることを生徒に話さないことでした。その理由は振り返ってみると幾分明白でした:人々が何かが簡単だと言った場合、解決策を見ていない人は、問題を解決する方法が得られないだけでなく、問題が愚かに感じられるかもしれません(さらに)彼らは愚かすぎて理解しにくいです!

Python / Djangoから来る人を困らせるだけでなく、何かを変更するとすぐにソースをリロードする落とし穴があります。Node.jsでは、デフォルトの動作では、1つの変更を行うと、古いバージョンは、時間の終わりまで、または手動でサーバーを停止して再起動するまでアクティブのままになります。この不適切な振る舞いは、Pythonistaを悩ませるだけではありません。また、さまざまな回避策を提供するネイティブNode.jsユーザーを苛立たせます。StackOverflowの質問「Node.js内のファイルの自動再読み込み」には、この記事の執筆時点では200以上の賛成票と19の回答があります。編集により、ホームページは次の場所にある乳母スクリプト、node-supervisorにユーザーを誘導します http://tinyurl.com/reactjs-node-supervisorの。この問題は、新しいユーザーが問題を修正したと思っていたので、愚かに感じる絶好の機会を与えていますが、古いバグのある動作はまったく変わっていません。そして、サーバーをバウンスすることを忘れがちです。私は何度もそうしました。そして、私が伝えたいメッセージは次のようなものです。Node.jsの設計者が適切な動作を提供する理由をここで見なかっただけです。おそらくノードスーパーバイザまたは別のソリューションから少し助けを借りて、それに対処するようにしてください。しかし、あなたが愚かであると感じて離れないでください。あなたは問題を抱えているのではありません。問題はNode.jsのデフォルトの動作にあります。」

議論の末、このセクションは残されました。これは、「簡単だ」という印象を与えたくないからです。私は物事がうまくいくように何度も手を切りましたが、問題を解決し、Node.jsとそのエコシステムを適切に機能させることは簡単なことであり、それも簡単ではないと信じるように設定したくありません。 、あなたは自分が何をしているかわからない。Node.jsを使用して厄介な問題に遭遇しない場合、それはすばらしいことです。もしそうなら、私は「私は愚かです-私に何か間違っているに違いない」という気持ちを捨てないでほしいと思います。Node.jsの扱いに厄介な驚きがあったとしても、馬鹿ではありません。あなたじゃない!それはNode.jsとそのエコシステムです!

付録では、前の章での上昇するクレッシェンドと結論の後で本当に望んでいませんでしたが、エコシステムで見つけたものについて話し、モロニックな文字主義の回避策を提供しました。

完全に適合しているように見え、まだ利用可能かもしれないもう1つのデータベースは、HTML5キー値ストアのサーバー側の実装です。このアプローチには、最も優れたフロントエンド開発者が十分に理解しているAPIの基本的な利点があります。さらに言えば、ほとんどのそれほど良くないフロントエンド開発者が十分に理解しているAPIでもあります。しかし、node-localstorageパッケージでは、辞書構文アクセスは提供されていませんが(localStorage.setItem(key、value)またはlocalStorage.getItem(key)を使用したいが、localStorage [key]ではありません)、完全なlocalStorageセマンティクスが実装されています、デフォルトの5MBクォータを含む— なぜですか?サーバー側のJavaScript開発者は自分自身から保護する必要がありますか?

クライアント側のデータベース機能の場合、Webサイトごとに5MBの割り当ては、開発者が作業できるようにするための寛大で有用な余地です。割り当て量を大幅に減らしても、Cookieの管理に加えて、リンピングを大幅に改善することができます。5MBの制限は、ビッグデータのクライアント側の処理にはすぐには適していませんが、リソースの豊富な開発者が多くのことを行うために使用できる非常に寛大な許容量があります。しかし、その一方で、最近購入されたほとんどのディスクの5MBは特に大きな部分ではありません。つまり、あなたとWebサイトがディスク領域の合理的な使用方法について意見の相違がある場合、または一部のサイトが単に煩わしい場合、実際にはコストはかかりません。あなたの多くはあなたのハードドライブがすでにいっぱいになっていない限り、あなたは沼地のハードドライブの危険にさらされません

ただし、サーバーのコードを記述している場合は、データベースを許容できる5MBを超えるサイズにすることからの追加の保護は不要であることが穏やかに指摘される場合があります。ほとんどの開発者は、乳母として機能し、5MBを超えるサーバー側データを格納することから保護するツールを必要とせず、必要もありません。また、クライアント側でのゴールデンバランシングアクションである5MBの割り当ては、Node.jsサーバーでは少しばかげています。(そして、この付録で説明されているような複数ユーザー用のデータベースの場合、ユーザーアカウントごとにディスク上に個別のデータベースを作成しない限り、ユーザーアカウントごとに5MBではないことが指摘されます。これは、5MBの間で共有されます。すべてのユーザーアカウントを一緒にします。痛いです話題になったら!)ドキュメントには割り当てがカスタマイズ可能であると記載されていますが、StackOverflowの質問と同じように、割り当てを変更する方法を尋ねる1週間前の開発者へのメールには回答がありません。私が見つけた唯一の答えはGithub CoffeeScriptソースにあり、コンストラクターへのオプションの2番目の整数引数としてリストされています。したがって、これは簡単で、ディスクまたはパーティションのサイズと同じクォータを指定できます。しかし、意味のない機能を移植することに加えて、ツールの作成者は、0を変数または関数の「無制限」を意味するものとして解釈するという非常に標準的な規則に完全には従うことができません。この誤った機能を使用する最良の方法は、クォータが無限であることを指定することです。

if (typeof localStorage === 'undefined' || localStorage === null)
  {      
  var LocalStorage = require('node-localstorage').LocalStorage;
  localStorage = new LocalStorage(__dirname + '/localStorage',
    Infinity);
  }

2つのコメントを順番に入れ替える:

JavaScriptを常に全体として使用している人々は不必要に自分の足を撃ち、JavaScriptの一部を立派な言語にしたのは、本質的にダグラス・クロックフォードでした。ここに良い部分があります。他に何かがあることを忘れてください。」おそらく、ホットなNode.jsエコシステムは独自の「Douglas Crockford」を成長させ、「Node.jsエコシステムはコーディングのワイルドウエストですが、実際に見つかる宝石がいくつかあります。これがロードマップです。ここでは、ほとんどすべてのコストで避けるべき領域があります。ここに、あらゆる言語または環境で見られる、最も裕福な給与の一部がある地域があります。」

おそらく他の誰かがそれらの言葉を挑戦として取り、Crockfordのリードに従い、Node.jsとそのエコシステムの「良い部分」や「より良い部分」を書くことができます。コピーを買います!

そして、すべてのプロジェクトの熱意と純粋な労働時間を考えると、この執筆時点で作成された未成熟なエコシステムについての発言を鋭く抑えるために、1、2、3年で保証される可能性があります。「2015年のNode.jsエコシステムにはいくつかの地雷原がありました。2020 Node.jsエコシステムには複数のパラダイスがあります。」


9

アプリケーションが主にWeb APIまたは他のIOチャネルをテザリングする場合、ユーザーインターフェースを提供または取得する場合、特に最もスケーラビリティを絞り出したい場合、または生活の中で主要な言語を使用する場合は、node.jsが最適ですJavaScript(または一種のJavaScriptトランスパイラー)です。マイクロサービスを構築する場合、node.jsも問題ありません。Node.jsは、小規模または単純なプロジェクトにも適しています。

その主なセールスポイントは、フロントエンドが通常の格差ではなく、バックエンドのものに責任を持つことができることです。もう1つの正当なセールスポイントは、従業員がまずJavaScript指向であるかどうかです。

ただし、特定のポイントを超えると、モジュール性、可読性、フロー制御を強制するためのひどいハックなしにコードをスケーリングすることはできません。ただし、これらのハックを好む人もいます。特に、イベント駆動のJavaScriptのバックグラウンドから来ているため、慣れ親しんでいるか、許されているようです。

特に、アプリケーションが同期フローを実行する必要がある場合、開発プロセスの点で大幅に遅くなる中途半端なソリューションに出血し始めます。アプリケーションに計算を多用する部分がある場合は、node.jsを(のみ)選択して注意深く踏み込んでください。たぶんhttp://koajs.com/や他の目新しさは、私が最初にnode.jsを使用したりこれを書いたりしたときと比較して、もともと厄介な側面を軽減します。


3
Node.jsアプリケーションをスケーリングするための既存のアプローチは数多くありますが、「中途半端なソリューション」、「ひどいハッキング」、「ひどいAPI」の主張に関する言及はないようです。それらを拡張する気に?
Sven Slootweg、2015年

読者への演習として残しておきますが、フロー制御のいわゆるソリューションを検討するだけで十分です。
マタンスター2015年

2
それは本当に答えではありません。あなたは、既存のソリューションは「ひどいハック」であると主張しますが、それらのどれも指摘していません。Node.jsアプリケーションをスケーリングするための正しい方法を単に理解していない、または認識していない可能性があると考えましたか?
Sven Slootweg、2015年

回答を少し更新しました。まだ苦情があるかもしれませんが、それが間違っていると思われる場合は、答えに欠けていることを指摘するのではなく、詳細にコメントしてください。それは、コミュニティーimoにとってより生産的です。
マタンスター2015年

-2

ノードjsを使用する理由と理由をいくつか共有できます。

  1. チャットなどのリアルタイムアプリケーションの場合、サーバーからクライアントへのイベントとデータを起動するイベントベースであるため、nodejsを使用すると、共同編集をより効果的に行うことができます。
  2. ほとんどの人が考えているJavaScriptベースなので、シンプルでわかりやすい。
  3. 現在のほとんどのWebアプリケーションは角張ったjs&backboneを目指しており、ノードでは両方がjsonデータを使用するため、クライアント側のコードと簡単に対話できます。
  4. 利用可能なプラグインがたくさん。

欠点:-

  1. Nodeはほとんどのデータベースをサポートしますが、複雑な結合などをサポートしないmongodbが最適です。
  2. コンパイルエラー...開発者は、エラーアコードアプリケーションが動作を停止し、手動でまたは自動化ツールを使用して再度開始する必要がある場合に、例外を処理する必要があります。

結論:-Nodejsは、シンプルでリアルタイムのアプリケーションに最適です。非常に大きなビジネスロジックと複雑な機能がある場合は、nodejsを使用しないでください。チャットやコラボレーション機能とともにアプリケーションを構築したい場合は、ノードを特定の部分で使用でき、便利なテクノロジーをそのまま使用できます。


-3
  1. Nodeは素早いプロトタイプに最適ですが、複雑なものには二度と使用しません。コンパイラーとの関係を築くのに20年を費やしましたが、確かにそれを見逃しています。

  2. Nodeは、しばらくアクセスしていないコードを維持するのに特に苦痛です。タイプ情報とコンパイル時のエラー検出は良いことです。なぜそれをすべて捨てるのですか?何のために?そして、何かが南に行くと、スタックトレースが完全に役に立たなくなることがよくあります。


2
コンパイル時のチェックは行われませんが、JSDocでは任意の型情報を追加できるため、戻ってきたときに状況がわかりやすくなります。適切に分解された(小さい)関数も、明確に定義された環境(クロージャ)により、通常は非常に簡単に理解できます。多くの場合、不正なスタックトレースは、何らかのリファクタリングで解決でき、その間に非同期コールバックを使用してロジックを分割しないようにします。同じクロージャー内に非同期コールバックを保持することで、推論と保守が容易になります。
Rich Remer 2014年

2
私はコンパイルされた言語で30年を費やしましたが、それを約1年だけ使用した後、JavaScriptが私の選択した言語になりました。Java C#C ++やCよりもはるかに少ないコードで多くのことを実行できますが、考え方は異なります。型なし変数は、実際には多くの場合に利点があります。JSLINTは不可欠です。並行して処理を行う必要がある場合、非同期コールバックは、スレッドを使用する必要があるどの言語よりもはるかに安全で、簡単で、最終的にはより生産的です。とにかく、JavaScriptはブラウザーの言語であるため、JavaScriptについて知っておく必要があります。
ジェームズ

私は提起された懸念に共感します。また、それらが確実に普遍的に適用されるわけではありませんが、それらに対処するためにいくつかの努力がなされてきたことに留意します。Ternと呼ばれる驚くべきプロジェクトがあり、Javascriptコードとライブラリーの静的分析から型の派生を提供できます。さまざまなエディター用のプラグインがあります。Typescript、JSDoc、およびBetterJSもあります。そして、多くのコンパイルからJavascript言語の 1つであるGoがあります
joeytwiddle 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.