2012-05-06 8 views
5

Expressアプリケーションでは、セッションを格納するためのconnect-mongodbおよびconnect-redisミドルウェアがあることがわかりましたが、なぜそれが必要なのか分からないのですが、デフォルトのメモリ内セッションストレージに何が問題なのですか?複数のマシン間でセッションを同期させる必要がある大規模アプリケーション向けですか?非接続のデフォルトセッションストアを使用する利点は何ですか?

また、誰でも最速のセッションストアのベンチマーク/ヒントを提供できますか?私の推測は、より単純なキー/バリューストアのため、Redisです。

答えて

12

セッションデータをデータベース(MongoDB、Redisなど)に保存する唯一の理由は、Nodeプロセス全体で使用できるようにすることであり、失敗しても永続的です。スケールアウト・アーキテクチャでは、ステートレス・サーバーを使用して、特定のユーザーが接続するサーバーと、状態を失うことなくサーバーを上下させることができます。

つまり、着信要求を処理するロードバランサの後ろに10台のサーバーがあるとします。ユーザー1は、サーバーAが処理してログインするように要求します。ログインしたという事実をセッションに保管するために保管する必要があります。次の要求は、サーバーAが別の要求でビジーであるため、サーバーCにルーティングされて終了します。サーバーCがユーザーが既にログインしていることを知るには、セッションデータが必要です。では、サーバーAによって保存されたセッションデータにどのようにアクセスできるのですか?

1つの方法は、リクエストごとに送信されるクライアント側のクッキーにデータを格納することですが、これはあまり安全ではありません。もう1つの方法は、ノードサーバー間で状態を同期させようとすることです。これは実行できますが、高価でエラーが発生しがちです。最も簡単な方法は、セッションIDをクッキーに格納してから、実際のセッションデータをデータベースに格納することです。各ノードサーバーは、セッションデータを検索できるように、同じデータベースにアクセスできます。このようにして、ノードサーバーの入出力を容易に拡張し、サーバーの障害時にデータを失うことなくロードバランスをとることができます。

パフォーマンス面では、インメモリストアが最も速くなります(ただし、上記の欠点があります)。 Redisが次に速くなり、MongoDBが最も遅くなります(通常、Redisより約4倍遅い)。いずれかのWebサイトの大多数のために十分な速さが十分にあることに留意してください。

関連する問題