8

大量の同時ユーザーを持つ Web アプリケーションを実装する必要があるとします。私は node.js を使用することに決めました。これは、拡張性が非常に高く、パフォーマンスが高く、オープン ソース コミュニティなどを備えているためです。その後、ボトルネックを回避するために、同じイベント ループに膨大な数のユーザーがいる可能性があるため、次のクラスターを使用することにしました。マルチコア CPU を活用するためのプロセス。さらに、Cassandra でビッグデータを操作する必要があるため、3 台 (メイン + 2) のマシンがあります。これは、3*n 個の node.js プロセスがあることを意味します。ここで、n は CPU のコア数です (マシンは同一です)。

では、調査を開始し、次のスキーマで終了します。

  • Nginx はポート 80 でリッスンし、静的コンテンツ (img、css、js など) を提供するためにのみ使用されます。
    動的トラフィ​​ックを haproxy に転送します。nginx の設定方法は知っていますが、まだ haproxy を確認する必要があるため、haproxy はポート 4000 でリッスンしていると言えます。Nginx と haproxy はメイン マシン (エントリ ポイント) にインストールされます。
  • Haproxy は 3 台のマシン間で負荷を分散します。ポート 4001 にトラフィックを転送します。つまり、node.js プロセスは 4001 をリッスンします。
  • すべての node.js には、4001 をリッスンする n プロセスのクラスターがあります。

私が正しければ、単一の http リクエストが単一の node.js プロセスに転送されます。

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

4

3 に答える 3

1

Ivan が指摘したように、セッション オブジェクトは memcache や redis、さらには Couchbase (memcache バケット) に保存します。また、スケーラブルなシステムを構築したい場合、目標は、需要に応じてスループットを向上させるために直線的にスケーリングできる方法でシステムを構築することです。つまり、要求を処理するために、いつでも (できればピーク時に) インフラストラクチャ内のさまざまな層にホストを追加できる必要があります。

そのため、開発中にどのテクノロジを選択し、設計上の決定を下すかについては、非常に注意する必要があります。

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

もう一つ付け加えておきたいのは、測定できなければ管理できないということです。「大量の同時ユーザー」があなたにとって何を意味するかを定義するのは良い出発点ですか? そのfacebookまたはwhatsAppタイプのボリューム/同時実行性はありますか? 最初に利害関係者 (存在する場合) と協力してこれらを定義してから、設計上の決定とテクノロジの選択に取り掛かることができます。

スケーラブルなシステムを構築する際の良いリトマス試験紙は、「単一障害点はありますか?」と自問することです。はいの場合、システムはスケーリングしません。

于 2016-03-10T03:57:00.983 に答える
0

別のユーザーが提案したように; Redisを使用することは、この問題に対する完全に受け入れられる解決策です。

その要点は、サービスを使用してセッション オブジェクトを保存し、ミドルウェアに他のすべての処理を任せることです。前述のように、ノード プロセスの再起動、クラッシュなどの場合に役立ちます。ノード プロセスにセッション データを保存することにはリスクが伴います。マイクロ サービス (Redis など) を使用する利点の 1 つは、これらのリスクが軽減されることです。

Expressミドルウェアにを使用すると仮定すると、a と呼ばれるものを使用できますSession store。この機能を利用するモジュールはたくさんあります。

そのようなモジュールの 1 つがconnect-redis です

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

npm install connect-redis express-session


次に、次のように使用します。

var session = require('express-session')
var RedisStore = require('connect-redis')(session)

app.use(session({
    store: new RedisStore(options),
    secret: 'keyboard cat'
}))

これで、通常どおりにセッション オブジェクトを使用できます。( req.session)


例:

セッション情報を設定するには (たとえば、フォーム POST から):

req.session.email = req.body.email


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

console.log( req.session.email )
于 2016-03-10T04:13:22.957 に答える