1. ホーム
  2. node.js

[解決済み] Node.jsのスケーリング

2023-04-09 05:35:02

質問

私は大規模なサーバーサイドの開発にはかなり新しいです。Node.jsを使用してサーバーを書きたいと思っていますが、先に進む前に、例えば20クエリ/秒までnodeをスケールアップするための一般原則が何であるかを知りたいと思います。

私が書いているサービスは、主にデータベースへのインターフェースであり、さらに認証と入力データの検証を行う予定です。

どのように解決するのですか?

ロードバランシング

おそらく、最もシンプルなサイトでは、スケーリングはまったく必要ないでしょう。ただ 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

<ブロッククオート

20クエリ/秒

node.jsで汗をかくことはありません。データストアはredisを使うべきでしょう。) node用のcライブラリもあります。 node_redis .

npm install hiredis redis

Hiredisはnodeの中でCコードにコンパイルされるため、非常に高いパフォーマンスを発揮することができます。以下はredisとhiredisを併用した場合のベンチマークです。

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は 何もない :).

認証について


更新しました。


私は何度も言っていますが、お願いですから、独自の認証システムを実装しようとしないでください。おそらく安全でない (多くのことがうまくいかない) ことになり、多くの労力がかかります。認証には、facebook-connectやtwitterのシングルサインインなど、優れた connect-auth ライブラリを使ってください。彼らはログインシステムに穴がないか専門家がテストしていますし、パスワードは平文で送信しません。また、あるユーザが facebook-connect .

入力データの検証

入力の検証を行うには ノードバリデータ .

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>'

また、こんなのもあります。 フォーム というライブラリもあり、フォームを作成するのに役立ちます。