9

たとえば、バックエンドにMongo DBがあり、ブラウザーに非常に軽量なJavaScriptが含まれている3層のWebサイトを構築しているとします(フォームの検証、AJAXリクエストを実行するいくつかの凝ったコントロールなど)。

「中間」層のテクノロジーを選択する必要があります(これをサブ層にセグメント化することもできますが、ここではその詳細に焦点を当てるのではなく、テクノロジー全体の選択だけです)。 DB、そしてこれを私がブラウザにプッシュするいくつかのHTMLにレンダリングします。かなり典型的なシンクライアントWebアーキテクチャ。

私の安全な選択は、Javaでこの中間層を実装することです。Jongoなどのライブラリを使用してMongo DBと通信し、Jacksonを使用してJSONをマーシャリング/アンマーシャリングしてAJAXリクエストを行うときにファンシーコントロールと通信します。また、サーバー上でHTMLをレンダリングするためのJavaテンプレートフレームワークもあります。

ただし、次の理由から、これらすべてをウィンドウの外に投げ出し、この中間層にNode.jsを使用するというアイデアに本当に興味があります。

  • 私はjavascript(良い部分)が好きです。このアプリケーションのビジネスロジックでは、Javaよりも表現力が高いとしましょう。

  • それはどこでもjavascriptです。スタック上のどこで作業する場合でも、言語を切り替える必要はなく、実際にはOOと関数型パラダイムを切り替える必要はありません。階層間に翻訳の配管はありません。JSONはどこでもネイティブにサポートされています。

  • クライアントとサーバーで検証ロジックを再利用できます。

  • 将来、ブラウザでクライアント側のHTMLレンダリングを行うことにした場合、リファクタリング/再テストの労力を最小限に抑えて、Backboneなどの既存のテンプレートを再利用できます。

この時点でNodeが好きなら、上記のすべてが明白に見えるでしょう。だから私はノードを正しく選ぶべきですか?

しかし...これは私にとっては難しいことです。私たち全員が知っているように、Nodeはシングルスレッドの非同期I /OWebサーバーモデルに基づいています。これは、データの要求を処理するという点でスケーラビリティとパフォーマンスに優れていますが、ビジネスロジックについてはどうでしょうか。テンプレートのレンダリングはどうですか?このようなものは、シングルスレッドのすべてのリクエストに大きなボトルネックを引き起こしませんか?

2つの明白な解決策が思い浮かびますが、どちらも正しくありません。

  1. そこに「ブロッキング」ビジネスロジックを保持し、ノードインスタンスのクラスターとロードバランサーを使用して、リクエストを真に並列に処理します。さて、そもそもNodeがマルチスレッドではないのはなぜですか?それとも、これは常にアイデアでしたか?シンプルな愚かさを保ち、ベースケースでマルチスレッドの複雑さの可能性を回避し、マルチコア処理能力が必要な場合は、プログラマーにこれに加えて追加のセットアップ作業を行わせるのですか?

  2. 単一のノードインスタンスを維持し、他のマルチスレッドのアプリサーバーで実行されているビジネスロジックのJava実装を呼び出すだけで、ブロックされないようにします。わかりました。このオプションは、DBへのCRUDリクエストのパフォーマンスとスケーラビリティが向上する可能性を除いて、Nodeの使用についてリストしたすべてのプロを完全に無効にします(実際、Javaを使用するよりも複雑になります)。

これが最終的に私の質問のポイントにつながります-ノードパズルのいくつかの非常に重要な部分が欠けているのでしょうか、事実が完全に間違っているのでしょうか、それともノードがサーバー上のビジネスロジックを処理するのに適していないのでしょうか?言い換えると、Nodeは、データベースの上に座って、I / Oをブロックする他の実装よりもパフォーマンスが高くスケーラブルな方法で多くのCRUDリクエストを処理するのに役立ちますか?そして、妥当なレベルのパフォーマンスとスケーラビリティを維持するために、すべてのビジネスロジックを下の層、またはクライアント側で実行する必要がありますか?

Nodeをめぐるすべての話題を考えると、これよりも多くのことがテーブルにもたらされることを望んでいました。そうでなければ納得したいです!

4

1 に答える 1

7

任意のシステムでN 個の CPU が利用可能です (1 ~ 64、またはたまたまNが何であれ)。CPU を集中的に使用するアプリケーションでは、N cpu のスループットで行き詰まるでしょう。Nを超えるスレッド/プロセスなどを追加してそれを修正する魔法の方法はありません。コードをより効率的にする必要があるか、より多くの CPU が必要です。より多くのスレッドは役に立ちません。

マルチ CPU のパフォーマンスに関するあまり知られていない事実の 1 つは、N+1個の CPU を集中的に使用する操作を同時に実行する必要がある場合、CPU あたりのスループットがかなり低下することです。CPU を集中的に使用するプロセスは、その CPU を放棄する前に非常に長い時間その CPU に固執する傾向があり、他のタスクをかなりひどく枯渇させます。ほとんどの場合、I/O のブロックとそれに付随するタスク切り替えが、最新の OS のマルチタスキングを正常に機能させています。日常の一般的なタスクの多くが CPU バウンドである場合、現在よりもはるかに多くの CPU がマシンに必要であることがわかります。

Node.js が効率的にサーバー パーティーにもたらす優れた点は、各スレッドを徹底的に使用することです。理想的には、タスクの切り替えが少なくなります。これは大きなメリットではありませんが、 N*C接続を非同期に処理するN 個のスレッドを持つことは、同じ数の CPU で実行されるN*Cブロック スレッドよりもパフォーマンス上の利点があります。しかし、CPU の結論は変わりません。実際に実行する CPU の作業がN 個を超えると、苦痛を感じるでしょう。

前回 Node.js API を見たとき、CPU ごとに 1 つのリスナーと 1 つのワーカー スレッドでサーバーを起動する方法がありました。あなたがそれを行うことができれば、いくつかの注意事項が満たされていれば、Node.js を使用する傾向があります。

  • Javascript のあらゆる場所でのアプローチにより、ある程度の単純さが得られます。複雑なことについては、非同期プログラミング スタイルが物事を簡単にするのではなく難しくしていることを懸念します。
  • テンプレート処理やその他の CPU を集中的に使用するタスクは、Node.js では、他の言語/プラットフォームの選択よりもそれほど遅くはありません。
  • データベース ドライバは信頼できます。

私が見ることができる1つの欠点があります:

  • スレッドがクラッシュすると、そのスレッドによって処理されているすべての接続が失われます。

最後に、プログラマーの時間は一般的にサーバーや帯域幅よりも高価であることを覚えておいてください。

于 2012-11-12T21:37:13.910 に答える