Node.jsのスケーリング


86

私は大規模なサーバー側の開発にはかなり慣れていません。Node.jsを使用してサーバーを作成したいのですが、先に進む前に、ノードを1秒あたり20クエリまでスケールアップするための一般的な原則を知りたいと思います。

私が書いているサービスは、主にデータベースへのインターフェースに加えて、入力データの認証と検証になります。


「ノードをスケールアップする」とはどういう意味ですか?複数のノードプロセスを開始しますか?
ティロ2011年

3
1秒あたり20クエリはかなり少ないです。Node.jsは、何千もの同時接続を処理できる必要があります。インタプリタ全体がブロックされるため、重いループ処理は行わないでください。ユースケースは、比較するとかなり軽量である必要があります。Nodeでは、データベース接続はスレッドに自動的に生成され、JavaScriptレベルで非同期に処理されます。
slebetman 2011年

回答:


149

負荷分散

ほとんどの場合、最も単純なサイトの場合、スケーリングはまったく必要ありません。たった1つの箱でカバーできます。その後、すべてのアーキテクチャでほぼ同じであると述べているように、負荷分散を行う必要があります(最初に複数のノードプロセスを開始できると言っているように。ただし、非常に大きくなると、より多くのボックスが必要になります)。

Nginxの負荷分散の例

http {
  upstream myproject {
    server 127.0.0.1:8000 weight=3;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;    
    server 127.0.0.1:8003;
  }

  server {
    listen 80;
    server_name www.domain.com;
    location / {
      proxy_pass http://myproject;
    }
  }
}

Redis

1秒あたり20クエリ

node.jsに汗はありません。redisは非常に高速なので、データストアとして使用する必要があります:)。node_redisを使用すると、ノード用のacライブラリもあります。

npm install hiredis redis

Hiredisは、ノード内のCコードにコンパイルされるため、キックアスパフォーマンスを提供します。これは、hiredisで使用した場合のredisのベンチマークです。

PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287

これらの数値を見ると、20 / sは何もありません:)。

認証


更新:


私はこれをたくさん言っていますが、神の愛のためにあなた自身の認証システムを実装しようとしないでください。それはおそらく安全ではないでしょう(多くはうまくいかない可能性があります)、多くの作業。認証には、優れたconnect-authライブラリを使用したfacebook-connect、twitterシングルサインインなどを使用する必要があります。その後、ログインシステムで穴をテストする専門家がいて、プレーンテキストでパスワードを送信しないので安全ですが、httpsを使用していただきありがとうございます。使いたいユーザー向けのトピックにも回答しました facebook-connect

入力データの検証

入力を検証するには、node-validatorを使用できます。

var check = require('validator').check,
    sanitize = require('validator').sanitize

//Validate
check('test@email.com').len(6, 64).isEmail();       //Methods are chainable
check('abc').isInt();                               //Throws 'Invalid integer'
check('abc', 'Please enter a number').isInt();      //Throws 'Please enter a number'
check('abcdefghijklmnopzrtsuvqxyz').is(/^[a-z]+$/);

//Sanitize / Filter
var int = sanitize('0123').toInt();                  //123
var bool = sanitize('true').toBoolean();             //true
var str = sanitize(' \s\t\r hello \n').trim();      //'hello'
var str = sanitize('aaaaaaaaab').ltrim('a');        //'b'
var str = sanitize(large_input_str).xss();
var str = sanitize('&lt;a&gt;').entityDecode();     //'<a>'

フォームの作成に役立つこのフォームライブラリもあります。


1
@nornagonどういたしまして:)。特に、独自のログインシステムを作成しないように注意してください;)。また、Jeff Atwood(Stackoverflowの作者)はそれに対して強くアドバイスします!=> blog.stackoverflow.com/2010/04/openid-one-year-later
アルフレッド

10
nginxが機能しないため、HAProxyを使用してWebSocketの負荷分散を行うことができます:)これは、どこかでWebSocketを使用する必要があるアプリケーションを開発している場合に提供されます。@alfredのすでに素晴らしい答えへの単なる追加。
シュリパッドクリシュナ2011

5
WebSocket

9
いい答えだ。ただし、everyauthよりもpassport.jsを強くお勧めします。
upTheCreek 2012

1
everyauthの代わりにパスポートはどうですか?
chovy 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.