私は大規模なサーバー側の開発にはかなり慣れていません。Node.jsを使用してサーバーを作成したいのですが、先に進む前に、ノードを1秒あたり20クエリまでスケールアップするための一般的な原則を知りたいと思います。
私が書いているサービスは、主にデータベースへのインターフェースに加えて、入力データの認証と検証になります。
私は大規模なサーバー側の開発にはかなり慣れていません。Node.jsを使用してサーバーを作成したいのですが、先に進む前に、ノードを1秒あたり20クエリまでスケールアップするための一般的な原則を知りたいと思います。
私が書いているサービスは、主にデータベースへのインターフェースに加えて、入力データの認証と検証になります。
回答:
ほとんどの場合、最も単純なサイトの場合、スケーリングはまったく必要ありません。たった1つの箱でカバーできます。その後、すべてのアーキテクチャでほぼ同じであると述べているように、負荷分散を行う必要があります(最初に複数のノードプロセスを開始できると言っているように。ただし、非常に大きくなると、より多くのボックスが必要になります)。
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を使用すると、ノード用の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('<a>').entityDecode(); //'<a>'