Node.js'yi Ölçeklendirme


86

Büyük ölçekli sunucu tarafı geliştirme konusunda oldukça yeniyim. Node.js kullanarak bir sunucu yazmak istiyorum, ancak ilerlemeden önce düğümü saniyede 20 sorguya kadar ölçeklendirmenin genel ilkelerinin ne olduğunu bilmek istiyorum.

Yazdığım hizmet, büyük ölçüde bir veritabanına bir arayüz, artı giriş verilerinin kimlik doğrulaması ve doğrulanması olacak.


Düğümü büyütmekle ne demek istiyorsun? Birden çok düğüm işlemi mi başlatıyorsunuz?
Thilo

3
Saniyede 20 sorgu oldukça düşüktür. Node.js aynı anda binlerce bağlantıyı idare edebilmelidir. Tüm yorumlayıcıyı engelleyeceği için yoğun döngü işlemi yapmayın. Kullanım durumunuz karşılaştırıldığında oldukça hafif olmalıdır. Düğümde, veritabanı bağlantıları otomatik olarak iş parçacıklarına üretilir ve javascript düzeyinde eşzamansız olarak işlenir.
slebetman

Yanıtlar:


149

Yük dengeleme

Büyük olasılıkla en basit siteler için herhangi bir ölçeklendirmeye ihtiyacınız yoktur. Sadece tek bir kutu sizi koruyacak. Bundan sonra da belirttiğiniz gibi her mimari için hemen hemen aynı olan yük dengeleme yapmalısınız (dediğiniz gibi önce birden çok düğüm sürecini başlatabilirsiniz. Ama gerçekten büyüdüğünüzde daha fazla kutuya ihtiyacınız var).

Nginx yük dengeleme örneği :

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

Saniyede 20 sorgu

Node.js için ter yok. Redis'i veri deponuz olarak kullanmalısınız çünkü çok hızlı :). Node_redis kullandığınızda düğüm için bir ac kitaplığı bile vardır .

npm install hiredis redis

Hiredis, düğüm içinde C koduna derlediği için size kickass performansı veren şeydir. Aşağıda, hiredis ile birlikte kullanıldığında redis'ten bazı karşılaştırmalar verilmiştir.

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

Bu sayılara baktığınızda 20 / s HİÇBİR ŞEY DEĞİL :).

Doğrulama


Güncelleme:


Bunu çok söylüyorum ama tanrı aşkına lütfen kendi kimlik doğrulama sisteminizi uygulamaya çalışmayın. Muhtemelen güvensiz olacak (çoğu şey ters gidebilir), çok iş. Kimlik doğrulaması için mükemmel bağlantı-kimlik doğrulama kitaplığını kullanarak facebook-connect, twitter tek oturum açma vb. Kullanmalısınız . O zaman güvende olursunuz, çünkü orada delikler için oturum açma sistemlerini test eden uzmanlar var ve şifreleri düz metin yoluyla iletmiyorlar, ancak Tanrı'ya şükür https kullanın. Ayrıca facebook-connect kullanmak isteyen bir kullanıcı için bir konuya cevap verdim .

giriş verilerinin doğrulanması

Girişi doğrulamak için düğüm doğrulayıcıyı kullanabilirsiniz .

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>'

Form oluşturmanıza yardımcı olacak bu form kitaplığı da vardır .


1
@nornagon hoş geldiniz :). Özellikle kendi oturum açma sisteminizi yazmamayı unutmayın;). Ayrıca Jeff Atwood (Stackoverflow yazarı) buna şiddetle karşı çıkıyor! => blog.stackoverflow.com/2010/04/openid-one-year-later
Alfred

10
Yük dengeleme WebSocket'leri için HAProxy'yi kullanabilirsiniz çünkü nginx çalışmayacaktır :) Bu, bir yerde WebSockets kullanmanızı gerektiren uygulamalar geliştirmeniz sağlanır! @ Alfred'in zaten harika cevabına bir ekleme.
Shripad Krishna

5
Web soketleri kullanmanız durumunda örnek bir HAProxy kurulumu: stackoverflow.com/questions/4360221/…
Shripad Krishna

9
İyi cevap. Passport.js'yi everyauth yerine şiddetle tavsiye ederim.
UpTheCreek

1
ya her zaman yerine pasaport?
chovy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.