Penskalaan Node.js

86

Saya cukup baru dalam pengembangan sisi server skala besar. Saya ingin menulis server menggunakan Node.js, tetapi sebelum melanjutkan, saya ingin tahu apa prinsip umum untuk menskalakan node hingga, katakanlah, 20 kueri per detik.

Layanan yang saya tulis sebagian besar akan menjadi antarmuka ke database, ditambah otentikasi dan validasi data input.

nornagon.dll
sumber
Apa yang Anda maksud dengan "node skala up"? Memulai beberapa proses node?
Thilo
3
20 kueri per detik cukup rendah. Node.js harus mampu menangani ribuan koneksi simultan. Hanya saja, jangan lakukan pemrosesan loop berat karena itu akan memblokir seluruh interpreter. Kasus penggunaan Anda harus cukup ringan jika dibandingkan. Di Node, koneksi database secara otomatis muncul ke thread dan ditangani secara asinkron di level javascript.
slebetman

Jawaban:

149

Penyeimbang beban

Kemungkinan besar untuk situs paling sederhana, Anda tidak memerlukan penskalaan sama sekali. Hanya satu kotak akan membuat Anda terlindungi. Setelah itu Anda harus melakukan load balancing seperti yang Anda sebutkan yang hampir sama untuk setiap arsitektur (seperti yang Anda katakan, Anda dapat memulai beberapa proses node terlebih dahulu. Tetapi ketika Anda menjadi sangat besar Anda membutuhkan lebih banyak kotak).

Contoh load balancing 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 kueri per detik

Tidak perlu repot untuk node.js. Anda harus menggunakan redis sebagai datastore Anda karena ini sangat cepat :). Bahkan ada pustaka ac untuk node saat Anda menggunakan node_redis .

npm install hiredis redis

Hiredis adalah apa yang memberi Anda kinerja kickass karena ia mengkompilasi ke kode C di dalam node. Berikut adalah beberapa tolok ukur dari redis saat digunakan dengan 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

Ketika Anda melihat angka-angka itu maka 20 / s TIDAK ADA :).

Autentikasi


Memperbarui:


Saya banyak menceritakan hal ini tetapi demi cinta Tuhan tolong jangan mencoba menerapkan sistem otentikasi Anda sendiri. Ini mungkin akan menjadi tidak aman (banyak yang bisa salah), banyak pekerjaan. Untuk otentikasi, Anda harus menggunakan facebook-connect, twitter single sign-in, dll menggunakan pustaka connect-auth yang sangat baik . Maka Anda dilindungi dengan aman karena mereka memiliki ahli yang menguji di sana sistem masuk untuk lubang dan juga tidak mengirimkan kata sandi melalui teks biasa tetapi terima kasih tuhan menggunakan https. Saya juga telah menjawab topik untuk pengguna yang ingin menggunakan facebook-connect .

validasi data masukan

Untuk memvalidasi input, Anda dapat menggunakan 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>'

Ada juga pustaka formulir ini untuk membantu Anda membuat formulir.

Alfred
sumber
1
@nornagon selamat datang :). Terutama ingat untuk tidak menulis sistem login Anda sendiri;). Juga Jeff Atwood (penulis Stackoverflow) sangat tidak menyarankannya! => blog.stackoverflow.com/2010/04/openid-one-year-later
Alfred
10
Anda dapat menggunakan HAProxy untuk load balancing WebSockets karena nginx tidak akan berfungsi :) Ini asalkan Anda mengembangkan aplikasi yang mengharuskan Anda menggunakan WebSockets di suatu tempat! Hanya tambahan untuk jawaban @ alfred yang sudah luar biasa.
Shripad Krishna
5
Contoh penyiapan HAProxy, jika Anda menggunakan websockets: stackoverflow.com/questions/4360221/…
Shripad Krishna
9
Jawaban yang bagus. Saya sangat merekomendasikan passport.js daripada everyauth.
UpTheCreek
1
bagaimana dengan paspor daripada everyauth?
chovy