[解決済み] Node.jsのスケーリング
質問
私は大規模なサーバーサイドの開発にはかなり新しいです。Node.jsを使用してサーバーを書きたいと思っていますが、先に進む前に、例えば20クエリ/秒までnodeをスケールアップするための一般原則が何であるかを知りたいと思います。
私が書いているサービスは、主にデータベースへのインターフェースであり、さらに認証と入力データの検証を行う予定です。
どのように解決するのですか?
ロードバランシング
おそらく、最もシンプルなサイトでは、スケーリングはまったく必要ないでしょう。ただ 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;
}
}
}
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('<a>').entityDecode(); //'<a>'
また、こんなのもあります。 フォーム というライブラリもあり、フォームを作成するのに役立ちます。
関連
-
[解決済み] joiライブラリを使用して2つの時間を比較する方法
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsで環境変数を読み込む
-
[解決済み] Node.jsでファイル/ディレクトリが存在するかどうかを同期的にチェックする
-
[解決済み] Node.jsのnpmモジュールをアンインストールするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Nodejs: Errorを解決する方法。ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】Google spreadsheet api Requestに不十分な認証スコープがあった。
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] ブラウザで動作しているURLで「connect ETIMEDOUT」エラーが発生する原因は何ですか?
-
[解決済み] Yarn にパッケージを強制的に再インストールさせるにはどうしたらいいですか?
-
[解決済み] MongoNetworkError: 最初の接続でサーバー [localhost:27017] への接続に失敗 [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017] 。
-
[解決済み] "致命的なエラーです。grunt "コマンドを実行すると、"Unable to find local grunt. "と表示されます。
-
[解決済み] WebSocketで特定の接続ユーザーにメッセージを送るには?