[ Bu yayın 2012-09-02 tarihinden itibaren günceldir (yukarıdakinden daha yeni).]
Node.js kesinlikle çok çekirdekli makinelerde ölçeklendirir.
Evet, Node.js işlem başına bir iş parçacığıdır. Bu çok kasıtlı bir tasarım kararıdır ve kilitleme semantiği ile başa çıkma ihtiyacını ortadan kaldırır. Buna katılmıyorsanız, muhtemelen çok iş parçacıklı kodda hata ayıklamanın ne kadar çılgınca olduğunu fark etmiyorsunuzdur. Node.js süreç modelinin daha derin bir açıklama için ve bu şekilde çalışır (ve neden birden konuları destekleyen ASLA) neden okumak benim diğer yazı .
Peki 16 çekirdekli kutumdan nasıl yararlanabilirim?
İki yol:
- Görüntü kodlama gibi büyük yoğun bilgi işlem görevleri için Node.js, alt işlemleri tetikleyebilir veya ek çalışan işlemlere ileti gönderebilir. Bu tasarımda, ağır bilgi işlem görevleri yapan ve diğer 15 CPU'yu çiğneyen olayların akışını ve N işlemlerini yöneten bir iş parçanız olur.
- Bir web hizmetindeki verimi ölçeklemek için, çekirdek başına bir kutu ve aralarında bölünmüş istek trafiği olmak üzere tek bir kutuda birden fazla Node.js sunucusu çalıştırmalısınız. Bu, mükemmel bir CPU benzeşimi sağlar ve verimi çekirdek sayımıyla neredeyse doğrusal olarak ölçeklendirir.
Bir web hizmetinde ölçekleme verimi
V6.0.X Node.js, küme modülünü kutudan çıkardığı için tek bir bağlantı noktasında dinleyebilecek birden çok düğüm çalışanı kurmayı kolaylaştırır. Bunun, npm aracılığıyla kullanılabilen eski learnboost "küme" modülü ile aynı OLMADIĞINI unutmayın .
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
İşçiler yeni bağlantıları kabul etmek için yarışacak ve en az yüklenen işlem büyük olasılıkla kazanacak. Oldukça iyi çalışıyor ve çok çekirdekli bir kutuda verimi oldukça iyi artırabilir.
Birden çok çekirdeği önemsemek için yeterli yükünüz varsa, o zaman birkaç şey daha yapmak istersiniz:
Node.js hizmetinizi Nginx veya Apache gibi bir web proxy'nin arkasında çalıştırın (aşırı yük koşullarının kutuyu tamamen aşağıya çekmesini istemiyorsanız), URL'leri yeniden yazın, statik içerik sunun ve diğer alt hizmetleri proxy yapın.
Çalışan işlemlerinizi periyodik olarak geri dönüştürün. Uzun süren bir işlem için, sonunda küçük bir bellek sızıntısı bile artacaktır.
Kurulum günlüğü toplama / izleme
Not: Aaron ve Christopher arasında başka bir yazının yorumlarında bir tartışma var (bu yazıdan itibaren en üstteki yazı). Bununla ilgili birkaç yorum:
- Paylaşılan bir soket modeli, birden çok işlemin tek bir bağlantı noktasını dinlemesine ve yeni bağlantıları kabul etmek için rekabet etmesine izin vermek için çok uygundur. Kavramsal olarak, her sürecin sadece tek bir bağlantıyı kabul edip sonra öleceği önemli bir uyarıyla bunu yapan önceden eğitilmiş Apache'yi düşünebilirsiniz. Apache için verimlilik kaybı, yeni süreçler istemekle yükümlüdür ve soket işlemleriyle hiçbir ilgisi yoktur.
- Node.js için, N işçinin tek bir sokette rekabet etmesi son derece makul bir çözümdür. Alternatif, Nginx gibi bir kutu üzerinde ön uç oluşturmak ve çalışanlara yeni bağlantılar atamak için çalışanlar arasında dönüşümlü olarak vekil trafiğe sahip olmaktır. İki çözüm de benzer performans özelliklerine sahiptir. Ve yukarıda da belirttiğim gibi, muhtemelen Nginx'in (veya bir alternatifin) düğüm hizmetinizi zaten ön plana çıkarmak isteyeceğinizden, buradaki seçim gerçekten arasında:
Paylaşılan Bağlantı Noktaları: nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
vs
Bireysel Limanlar: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
Bireysel bağlantı noktaları kurulumunun tartışmasız bazı faydaları vardır (işlemler arasında daha az bağlantıya sahip olma potansiyeli, daha karmaşık yük dengeleme kararları vb.), Ancak kesinlikle daha fazla çalışma yapılması ve yerleşik küme modülünün düşük olması - çoğu insan için çalışan karmaşıklık alternatifi.