Масштабирование Node.js - PullRequest
       3

Масштабирование Node.js

86 голосов
/ 17 января 2011

Я довольно новичок в крупномасштабной разработке на стороне сервера. Я хочу написать сервер с использованием Node.js, но прежде чем двигаться вперед, я хотел бы узнать, каковы общие принципы масштабирования узла, скажем, до 20 запросов в секунду.

Служба, которую я пишу, будет в основном интерфейсом для базы данных, а также аутентификацией и проверкой входных данных.

1 Ответ

148 голосов
/ 17 января 2011

Балансировка нагрузки

Скорее всего, для самых простых сайтов вам вообще не нужно масштабирование. Всего одна коробка покроет вас. После этого вы должны выполнить балансировку нагрузки, как вы упомянули, которая практически одинакова для каждой архитектуры (как вы говорите, что вы могли бы сначала запустить несколько узловых процессов. Но когда вы становитесь действительно большими, вам нужно больше блоков).

Пример балансировки нагрузки 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 в качестве хранилища данных, потому что это безумно быстро :). Существует даже библиотека c для узла, когда вы используете node_redis .

npm install hiredis redis

Hiredis - это то, что дает вам потрясающую производительность, потому что он компилируется в 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 / с - это НИЧЕГО :).

Аутентификация


Обновление:


Я много говорю об этом, но ради любви к Богу, пожалуйста, не пытайтесь реализовать собственную систему аутентификации. Вероятно, это будет небезопасно (многое может пойти не так), много работы. Для аутентификации вы должны использовать facebook-connect, единый вход в твиттер и т. Д., Используя отличную библиотеку connect-auth . Тогда вы защищены, потому что у них есть эксперты, которые тестируют там системы входа в систему на наличие дыр, а также не передают пароли в виде простого текста, но, слава богу, используют 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>'

Существует также библиотека forms , которая поможет вам создавать формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...