web-dev-qa-db-ja.com

Node.jsのスケーリング

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

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

86
nornagon

負荷分散

最も単純なサイトの場合、おそらくスケーリングはまったく必要ありません。たった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;
    }
  }
}

レディス

1秒あたり20クエリ

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

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は[〜#〜] nothing [〜#〜]:)です。

認証


更新:


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

入力データの検証

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

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

//Validate
check('[email protected]').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>'

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

148
Alfred