web-dev-qa-db-ja.com

分散node.jsアプリケーションを作成する方法は?

Node.jsアプリケーションの作成は非常に簡単です。

var app = require('express')();
app.get('/',function(req,res){
    res.send("Hello world!");
});

しかし、人々があなたのHello World!アプリケーションとリソースを使い果たしました。この例は、実際にどのようにスケールアップできますか?はい、別のコンピューターでいくつかのnode.jsインスタンスを開くことができますが、誰かが http://your_site.com/ にアクセスすると、その特定のマシン、ポート、その特定のノードプロセス。どうやって?

41
MaiaVictor

これに対処する多くの方法がありますが、それは2つの事に要約されます:

  1. サーバーごとにより多くのコアを使用できる
  2. 複数のサーバーを超えて拡張できること。

ノードクラスター

最初のオプションでは、node-clusterまたはsecondeオプションと同じソリューション。 node-clusterhttp://nodejs.org/api/cluster.html )は、本質的に、ノードプロセスを1つのマスターと複数のワーカーに分岐するための組み込みの方法です。通常、1つのマスターとn-1からn個のワーカー(nは使用可能なコアの数)が必要です。

ロードバランサー

2番目のオプションは、(同じサーバー上またはサーバー間で)複数のワーカー間で要求を分散するロードバランサーを使用することです。

ここには複数のオプションもあります。以下にいくつかを示します。

もう1つ、複数のプロセスがリクエストを処理し始めると、メモリを使用して状態を保存できなくなり、共有状態を保存するための追加サービスRedis( http://redis.io )が必要になりますは一般的な選択肢ですが、決して唯一のものではありません。

Cloudfoundry、herokuなどのサービスを使用する場合、アプリのロジックを心配するだけで設定できます(そして、サービスを使用して共有状態を処理する)。

35

私はかなり長い間ノードで作業していましたが、最近ノードアプリをスケーリングしようとする機会を得て、今しばらく同じトピックで研究しており、スケーリングの次の前提条件に出会いました:

  1. 私のアプリは、ノードの複数のインスタンスをそれぞれ実行する分散システムで利用可能である必要があります

  2. 各システムには、ノードインスタンス間でトラフィックを分散するのに役立つロードバランサーが必要です。

  3. 分散システム上のノードインスタンスにトラフィックを分散するマスターロードバランサーが必要です。

  4. マスターバランサーは常に実行されている必要がありますORアプリを安定させるために信頼できる再起動メカニズムが必要です。

上記の必要条件について、私は以下に出くわしました:

  1. cluster などのモジュールを使用して、システム内のノードの複数のインスタンスを起動します。

  2. 常にnginxを使用してください。これは、これまで出会ったロードバランサーを作成するための最も簡単なメカニズムの1つです。

  3. HAProxy を使用して、マスターロードバランサーとして機能します。 少数のポインター 使用方法と永久に実行し続ける方法。

有用なリソース:

  1. node.jsおよびwebsocketの水平スケーリング
  2. クラスターを使用して複数のコアを活用します。

進行中にこの回答を更新し続けます。

5

複数のマシンを使用する基本的な方法は、それらをロードバランサーの背後に置き、すべてのトラフィックをロードバランサーに向けることです。そうすれば、誰かが http://my_domain.com に移動し、ロードバランサーマシンを指すようになります。ロードバランサーの唯一の目的(とにかくこの例では、理論的にはもっとできること)は、アプリケーションを実行している特定のマシンにトラフィックを委任することです。これは、アプリケーションを実行しているマシンをx台持つことができることを意味しますが、外部マシン(この場合はブラウザー)はロードバランサーのアドレスにアクセスして、そのうちの1つに到達できます。クライアントは、どのマシンが実際にリクエストを処理しているかを知りません(そして知る必要もありません)。 [〜#〜] aws [〜#〜] を使用している場合、これを設定および管理するのは非常に簡単です。 Pascalの答えには、ここでのオプションに関する詳細が含まれていることに注意してください。

Nodeを使用すると、具体的には Node Cluster モジュールを見ることができます。このモジュールの経験はあまりありませんが、同じポートを共有する1台のマシンでアプリケーションの複数のプロセスを生成します。また、まだ実験段階であり、どの程度信頼性があるかはわかりません。

2
Nick Mitchinson

Node.jsのマイクロサービスツールキットである http://senecajs.org をご覧になることをお勧めします。これは初心者にとっては良い出発点であり、モノリシックなアプリケーションではなく「サービス」で考え始めることです。

そうは言っても、分散アプリケーションを構築するのは難しく、時間をかけて学習し、[〜#〜] lot [〜#〜]時間をかけて習得する、通常、パフォーマンス、信頼性、マンテナンスなどの間で多くのトレードオフに直面します。

1
Cartucho