Масштабування Node.js


86

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

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


Що ви маєте на увазі під "масштабуванням вузла вгору"? Запуск декількох процесів вузлів?
Тіло

3
20 запитів в секунду є досить низьким. Node.js повинен мати можливість обробляти тисячі одночасних з'єднань. Просто не робіть важку обробку циклу, оскільки це заблокує весь інтерпретатор. Ваш варіант використання має бути порівняно невеликим. У Node підключення до бази даних автоматично породжуються до потоків і обробляються асинхронно на рівні javascript.
slebetman

Відповіді:


149

Балансування навантаження

Швидше за все для найпростіших сайтів вам взагалі не потрібно масштабування. Лише одна коробка забезпечить вас покриттям. Після цього вам слід виконати балансування навантаження, як ви згадуєте, що майже однаково для кожної архітектури (як ви кажете, що спочатку можна запустити кілька процесів вузлів. Але коли ви дійсно великі, вам потрібно більше ящиків).

Приклад балансування навантаження 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;
    }
  }
}

Редіс

20 запитів в секунду

Немає поту для node.js. Ви повинні використовувати redis як свою сховище даних, бо це шалено швидко :). Існує навіть бібліотека змінного струму для node, коли ви використовуєте node_redis .

npm install hiredis redis

Hiredis - це те, що дає вам продуктивність kickass, оскільки він компілюється в код 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, twitter single sign-in тощо, використовуючи чудову бібліотеку 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>'

Існує також ця бібліотека форм, яка допоможе вам створити форми.


1
@nornagon ласкаво просимо :). Особливо пам’ятайте, що не слід писати власну систему входу;). Також Джефф Етвуд (автор Stackoverflow) настійно не рекомендує це робити! => blog.stackoverflow.com/2010/04/openid-one-year-later
Альфред

10
Ви можете використовувати HAProxy для балансування навантаження WebSockets, оскільки nginx не буде працювати :) Це за умови, що ви розробляєте програми, які вимагають десь використовувати WebSockets! Просто доповнення до вже чудової відповіді @ alfred.
Шріпад Кришна

5
Приклад HAProxy установки, в разі , якщо ви використовуєте WebSockets: stackoverflow.com/questions/4360221 / ...
Shripad Крішна

9
Гарна відповідь. Однак я настійно рекомендую visa.js над усіма авторами.
UpTheCreek

1
а як щодо паспорта замість усякого?
човий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.