質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.60%

  • Linux

    3641questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • CentOS

    2641questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Node.js

    1796questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

同一サーバ内で稼働する複数プロセスへのリクエスト分散方法

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,239

777

score 29

お世話になります。

node.jsでシステム(※)を作っています。
最初にユーザからのアクセスを80ポートで受けて
それを子プロセスに分散させる方法がわからずに悩んでおります。

そこで、掲題の方法がお分かりになられる方、
お知恵お貸し頂けませんでしょうか。。。

(※)作成中のシステム
親プロセス1 … 子プロセス間のデータ連携
子プロセス1 … 共通サービス 個別サービスA
子プロセス2 … 共通サービス 個別サービスB
子プロセス3 … 共通サービス 個別サービスC

LVSを使って出来るのかなと思っていたのですが、
そもそも同一物理サーバ内の複数プロセスに
アクセスを分散させる用途では使えない(?)ようで
どうしたものかと。。。

以上、よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • pi-chan

    2015/09/06 09:56

    「最初にユーザからのアクセスを80ポートで受けて、それを子プロセスに分散させる」という機能を親プロセスに担わせようとしておられるのですか? それとも親プロセスは「子プロセス起動」+「子プロセス間連携」が主な機能で、各子プロセスは個別にhttpリクエストを待ち受ける仕組みですか?

    キャンセル

  • 777

    2015/09/06 10:08

    pi-chanさん、ご指摘ありがとうございます。 親プロセスは、子プロセスの起動と子プロセス間での プロセス間通信が主な機能として実装をすすめてきました。 さらに、出来たら親プロセスで、子プロセスの死活監視を行わせ、 子プロセスが死んだら再立ち上げという部分まで実装したいなと思っています。 親の死活監視は、foreverを使って行おうと考えております。 親プロセスに子プロセスへのアクセス振り分け機能をつけない理由ですが、 親プロセスには子プロセス間のプロセス間通信のハブという役割があるので、 その時点で負荷が大きいのかなと考えているためです。 その上アクセス割り振りまで担わせてしまうのは まずい気がしているためです。 LVSで子プロセスへアクセスを分散させられればうれしいのですが、 なんとかなりませんでしょうか。。。 (LVSでなくとも良いのですが、それしか今のところ存じないので) そもそも、上記のような設計は良くないのでしょうか。 親プロセスに振り分けまで担わせた方がいいのでしょうか。。。 マルチプロセスを使ったプログラミングが初めてなので 設計もこれでいいのか、不安です。。

    キャンセル

  • pi-chan

    2015/09/06 11:25

    ちょっと気になっているのですが…子プロセス1〜3は提供するサービスは内容が(一部)異なるのに、いわゆる通常のロードバランサーのように、単純にリクエストを振り分けたのではまずいのではないでしょうか?一般に、リクエストの内容(パラメータの違いとか)に応じて異なるサービスを提供するという目的であれば、そもそもリクエストが異なる訳ですから、(親プロセスとは別でも構わないですが)コントローラー(代表してリクエストを待ち受け処理を振り分ける)を一つ作成するか、あるいはapacheか何かでプロキシを立て、rewrite機能でURL自体を書き換えてやるという方法もあるとおもいますが。単にパフォーマンス向上のために処理を振り分けたいということであれば、「処理内容の同じ」プロセスを多重起動させ、リクエスト内容に応じたレスポンスを返す仕組みにすれば良いと思います。 要するに、「負荷分散」と「処理の振り分け」を混同しているために複雑なことをしようとされているだけのように思いますので、要件をもう少し整理してみてはいかがですか?

    キャンセル

  • 777

    2015/09/06 12:41

    pi-chanさん、ありがとうございます。 補足させて頂きます。 共通サービスというのはサービスメニュー表示のようなものをイメージ頂けますでしょうか。 ロードバランサーで振り分けたいのはこちらへのアクセス部分のみです。 サービスメニューに多くの情報を盛り込んでいて、 重いので各プロセスで3等分したいのです。 共通サービスに使う情報はプロセス間通信で子プロセスにミラーリングしてあります。 (redisを使いたくなかったのでこういう形になりました。。。) 個別サービスに使う情報は各子プロセスだけで保持しています。 子プロセスの一つでも落ちたらその子プロセスが担っていたサービスは提供できなくなります。 子プロセスが落ちた場合は、親プロセスを通じて他の子プロセスへ通知し 共通メニューからは、落ちた子プロセスのサービスを除外します。 子プロセスを復活出来たらサービスを追加します。 サービスメニューには各サービスへのリンク(※)を載せていますので、 共通メニュー以降のアクセスでは振り分けの必要は無いと考えております。 (※)リンクの例 <a href="http://123.123.123.123:45670/service.html?serviceID=891&gt;サービスA(891)</a> <a href="http://123.123.123.123:45671/service.html?serviceID=910&gt;サービスB(910)</a> <a href="http://123.123.123.123:45672/service.html?serviceID=101&gt;サービスC(101)</a> 上記のような形で、URLにポート番号を直接埋め込んでいるので、 ユーザは該当サービスのポートにたどり着けると思っています。 (ポート番号を見せてしまうのはスマートなやり方ではないと思っていますが他に方法が思いつかず。。。) 以上ふまえまして、何か方法ございませんでしょうか。。

    キャンセル

回答 2

0

forkのような事はできそうですが、forkされているわけではなさそうです。
公式サイト:child_process.fork()
child_process.fork()

nginxをフロントに立てて、workerのプロセス数を増やせば分散処理できますが、forkとは違い親プロセスが子プロセスを管理するという事が出来なくなるので、redisやmemcacheといったKVSや、RDBMS等を活用して情報共有を図る必要が出てくると思います。

node.jsを使った事がないので、詳しい動作まで調べておりません。。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/06 17:07

    Ken.sakanakanaさん
    ご回答ありがとうございます。

    仰るように、child_process.fork()を使っております。
    これで親1と子3を形成しております。

    この、子3に対して外部からのアクセスを振り分けたいのです。

    手段は問わないのですが、
    80番ポートで待ち受けするトップページを仮想的に建てておいて、
    そこに来たアクセスをnode子プロセスに振り分ける
    のような感じの事がしたいのです。。。
    ※1手段としてLVSを考えていたのですが、ダメでした。

    親も子プロセス間のデータ連携処理で高負荷になると思うので、
    親プロセスに割り振りの機能を持たせたくは無いです
    ※というか正直親でどうやって振り分けたらいいのかわからないです。

    振り分けの機能以外は作成完了しているので、
    あまり変更をせずに、nodeの外で解決出来ればなと思っています。

    キャンセル

  • 2015/09/06 22:23

    apacheとnginxの比較でよく用いられるのですが、forkする方が高負荷に陥りやすいと思うのですが、スレッド処理では何か不都合があったのでしょうか。
    バックエンド処理で待ちが長くなるなら、キューイング処理させ、結果をポーリングさせることで、1コネクション毎の空き時間を作り別スレッドの処理を回せるようになると思うのですが。。。旨く説明できなくてすみません。
    ↓この資料を見てもらうとなんとなくわかるかもしれません!
    http://www.slideshare.net/kazeburo/isucon-summerclass2014action2final

    キャンセル

  • 2015/09/07 11:26

    Ken.sakanakanaさん
    ご回答ありがとうございます。

    nodeはシングルスレッドでしか動かないので
    クラスタ化等しないとサーバの複数プロセスを活かせないので
    マルチタスク化を狙いました。

    その結果、今の構成になりました。
    はたして性能向上しているのかわからないですが。。。

    頂いたURL参考にさせて頂きます。

    キャンセル

0

nginxを表に立てておいて、裏で動かしてるpm2で管理させたnode.jsアプリにロードバランスしながら流すという方法をよく使ってます

この辺が参考になるのではないでしょうか
pm2のforkモードで動的にCPUと同じ数のhttpサーバを起動する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/08 12:55

    khiroseさん
    ご回答ありがとうございます。

    子プロセスに別ポートを割り振って、
    各プロセスにnginxからアクセスを分散させるという感じでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3641questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • CentOS

    2641questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Node.js

    1796questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。