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

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

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

Ответ 1

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

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

Пример балансировки нагрузки 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, когда вы используете node_redis.

npm install hiredis redis

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

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


Update:


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