2012-11-13 7 views
6

私は大量の同時ユーザーを持つWebアプリケーションを実装する必要があります。私はnode.jsを使用することにしました。これは、規模が非常に良く、パフォーマンスが良いし、オープンソースコミュニティなどがあるからです。そして、同じイベントループでユーザーの数が多いため、ボトルネックを避けるために、マルチコアCPUを利用するためのプロセス。さらに、私はCassandraでビッグデータを操作する必要があるため、3台のマシン(メイン+ 2)があります。これは、3 * n node.jsのプロセスがあることを意味します。ここで、nはCPUのコア数(マシンは同一)です。分散したnode.js Webサーバーを設計する方法

[OK]を、私は研究を開始し、私は次のスキーマで終わる:

  • nginxのポート80でリッスンし、静的コンテンツ(IMG、CSS、JS、等)を提供するためにのみ使用。
    ダイナミックトラフィックをhaproxyに転送します。私はnginxのを設定する方法を知っているが、私はまだhaproxyルックを取らなければならないので、私はそれhaproxyはnginxのとhaproxyがメインマシン(エントリー・ポイント)にインストールされているポート4000 でリッスンしていると言うでしょう。
  • 3台のマシン間のハプロキシ負荷分散。それは私が、単一の正しいだ場合のNode.jsプロセスは、n個のプロセスのクラスタが4001

に耳を傾けてい

  • すべてのNode.js 4001を聞いている、つまり、ポート4001へのトラフィックを転送しますhttpリクエストは単一のnode.jsプロセスに転送されます。セッションの作成

    は、右、非常に正常ですか?セッションは単なるマップであり、このマップはObjectであり、このObjectはnode.jsプロセス内に存在します。 Haproxyはラウンドロビンスケジューラで設定されるため、同じユーザーを別のnode.jsプロセスに転送することができます。すべてのnode.jsプロセスで同じセッションオブジェクトを共有するにはどうすればよいですか?どのようにグローバルオブジェクト(これは同じマシン(node.jsクラスター)とネットワーク全体を含む)を共有できますか? node.jsを使用して分散型Webアプリケーションを設計するにはどうすればよいですか?同期タスクを容易にするモジュールはありますか?

  • +1

    haproxyには、スティッキセッションを処理する複数の方法があります。http:// stacko verflow.com/questions/6498030/load-balancing-haproxy-or-other-sticky-sessionsグローバルオブジェクトの場合は、redisなどを使用します。 – numbers1311407

    +0

    http://stackoverflow.com/questions/5398209/scaling-node-js-across-multiple-cores-serversに似ています.3台のサーバもあります。 –

    答えて

    1

    セッションオブジェクトの格納にmemcacheまたはredisを使用できます。ノードの再起動プロセス(セッションのデータがプロセスのメモリに保存されている場合は失われます)の場合には非常に便利です。

    また、あなたはpm2機能リストを検査することができますし、多分そのうちのいくつかは、あなたのために有用であろう。

    ビルマイクロサービスアーキテクチャは、優れたスケーラビリティを行います。

    1

    イワンが指摘したように、あなたはmemcacheのか、RedisのかさえCouchbaseの(memcacheのバケット)でセッションオブジェクトを格納。また、スケーラブルなシステムを構築したい場合は、需要に基づいてスループットを向上させるために線形に拡張できるようにシステムを構築することが目標です。つまり、インフラストラクチャ内のさまざまな層に、いつでも(ピーク時には)より多くのホストを追加して、要求を処理できるようにする必要があります。

    だから、あなたが選んで、設計上の決定は、あなたが開発中に作るものの技術では非常に注意する必要があります。

    私は大量の同時ユーザーを持つWebアプリケーションを実装する必要があります。

    私が追加したいもう一つのことは、測定できない場合は管理できないことです。 「大量の同時ユーザー」があなたに何を意味するのかを定義するのがよいでしょうか?そのfacebookかwhatsApp型のボリューム/並行性ですか?最初にステークホルダーと協働することでこれらを定義すると、設計上の意思決定とテクノロジの選択を開始できます。

    スケーラブルなシステムを構築している間、良いリトマステストは、 "単一の障害点がありますか?"はいの場合、システムは拡大縮小されません。

    0

    別のユーザーが示唆したとおり、 Redisを使用することは、この問題に対する完全に許容される解決策です。

    セッションオブジェクトを保存するためにサービスを使用し、ミドルウェアが他のすべてに注意を払うようにすることです。前述したように、ノードプロセスの再起動、クラッシュなどの場合に便利です。ノードプロセスにセッションデータを格納すると、リスクが発生します。マイクロサービス(Redisなど)を使用する利点の1つは、これらのリスクが軽減されることです。

    ミドルウェアにExpressを使用すると仮定すると、Session storeという名前を使用できます。この機能を利用する多くのモジュールがあります。

    npm install connect-redis express-session 
    


    そうのような、あなたはそれを使用します:

    一つのそのようなモジュールはconnect-redis

    インストールでは、いつものように簡単です

    var session = require('express-session') 
    var RedisStore = require('connect-redis')(session) 
    
    app.use(session({ 
        store: new RedisStore(options), 
        secret: 'keyboard cat' 
    })) 
    

    今、あなたはあなたのセッションオブジェクトを使用して、あなたと同じように。 (req.session


    例:セッション情報を取得する

    req.session.email = req.body.email 
    


    (例えば、フォームPOSTからの)セッション情報を設定する

    console.log(req.session.email) 
    
    関連する問題