2016-03-21 6 views
3

Webサーバー、メッセージングキュー、およびx N個のワーカープロセスを使用してクライアント要求を処理したい場合、通常のパターンは何ですか?私は考えることができる何ワーカープロセス経由でクライアントに応答を返すためのnode.jsパターンは何ですか

されています

  1. 労働者は、キューからのジョブを取るプロセスを、ポーリングにクライアントのために結果を保存します。 Webサーバーと作業者の間に通信がない場合

  2. ワーカーはジョブをキューから取り出し、処理して結果キューに送信します(これはWebサーバーで消費されます) Webサーバーはそれをクライアントに送り返します。一方、クライアントは待機します(これは長いポーリングと呼ばれますか?)

  3. Webサーバーはすぐに応答を返し、ジョブをワーカー・キューにプッシュします。ワーカーはジョブをキューから取り出し、処理し、結果キューに送信します。結果キューはWebサーバーによって消費され、Webサーバーはwebsocket経由でクライアントに送信されます。この場合、クライアントはそうする必要はありません。

どれがよく使用されていますか?または、より良い解決策がありますか?

答えて

5
  1. 労働者は、それは、ポーリングするクライアント のための結果を保存するキュー、プロセスから仕事を取ります。だから、ウェブサーバと 労働者

間の通信がない一般的に、クライアントはWebサーバだけと通信しますので、これはまれです。したがって、簡単なワーカーをいくつかの追加ポートでWebサーバーにしてCORS通信を可能にする場合を除き、これは通常行われません。

  • ワーカープロセスを、キューから仕事を取る、( 速達でこれを行うにはどのように?)、Webサーバによって消費される結果キューにそれを送信
      Webサーバーはそれをクライアントに送り返します。これは一方通行にあるので、あなたが集中的計算(例えばCPUバインド)操作を持っている場合、一方のクライアント (これはまだ長いポーリングと呼ばれている?)お待ちしております
  • これは、Node.jsのでは比較的一般的です集中的な操作を計算しているときにnode.jsのスケールを改善できます。おそらく、クラスタリングモジュールを使用してN個の同一のnode.jsプロセスを起動し、その結果をWebサーバーに返信する個別のワーカープロセスよりも実装が簡単なため、負荷を共有するのが一般的です。

    1. Webサーバーはすぐに応答を返し、ジョブをワーカーキューにプッシュします。ワーカーはキューからジョブを取り出し、処理し、結果をWebサーバーが消費する キューに送信し、Webサーバーはwebsocket経由でクライアントに を送信します。この場合、クライアントはそうする必要はありません。あなたが長い実行中のHTTP接続を介してかのWebSocketを介してクライアントに戻って通信するかどうかは、

    は、要因の束に依存します。計算時間が長い場合(例:複数分の場合は、ブラウザのタイムアウトの問題が発生するため、クライアントが数分間でポーリングを戻すかwebSocketを使用する方が簡単かもしれません)。これが唯一のものであればwebSocketを使用しない傾向があります。しかし、サーバーからクライアントへの通知をプッシュするためのwebSocketを持つ他の理由がある場合、私はこの目的のために絶対に使用します。

    どれがよく使用されていますか?または、より良い解決策がありますか?

    クラスタリング(あなたのオプションと一致しない)がおそらく最も使用されます。しかし、多くのコンピューティング集約型操作がある場合、要求のキューに対応するワーカー・プロセスのプールを持つことは、node.jsの共通の設計パターンです。

    複数のデータベース操作が完了するまでに時間がかかるという理由だけで、操作が長期間実行される場合は、ほとんど非同期操作ですが、必ずしもすべての作業者が必要なわけではありません。 node.jsは、それぞれが一連の非同期操作を実行している場合には、多数の同時接続に適しています。したがって、通常は、CPU集中型の作業(node.jsスレッドが実行中に何か他のことを行うことを妨げるもの)がある場合は、クラスタリングまたはワーカープロセスに進む必要があります。一連の20個の非同期データベース操作が完了するまでに数分かかる場合がありますが、node.jsプロセスのクラスタリングやnode.jsのスケーリングのための作業者は必要ありません。実際には、データベースサーバのスケーリングが他の何よりも必要になると思われます。

    だから、どのように一般的な、私はあなたがこれを見たいと言う思いのために:非同期I/Oを持つ

    1. コードと、あなたは、単一のノードとの同時要求の多くのための優れたスケーラビリティを得ます。 jsプロセス。

    2. node.jsクラスタリングを使用してCPUごとにクラスタを追加します。これにより、操作のCPUバウンド部分に対して、CPUの使用率を最大限に最大限に引き出すことができます。スケーラビリティを最大限にするには、非同期I/Oを使用してコードを作成する必要があります。

    3. 特定の操作がすでに外部プロセスで実装されている場合、またはCPUにバインドされている場合は、キューとワーカーアーキテクチャを使用できます。物事がCPUバウンドで、非同期I/Oを使用している場合は、複数のサーバーに接続せずにCPUを使用するよりも多くの人員を必要としません。

    長い走行HTTPレスポンスとして、またはのWebSocketが完全に直交質問され、その結果にかかる時間についての依存を介して結果を返す通信するかどうか(それが長時間実行されているHTTPレスポンスを使用する実用的なのかどうか)、途中で進捗状況を伝えたいと思っているかどうか、また、他の理由ですでにwebSocket接続を持っているかどうか。この質問の部分は、複数のプロセスを実装する方法について他の選択を促すべきではありません。

    関連する問題