Herkesin bildiği üzere NodeJS, Google Chrome’ un JavaScript runtime‘ ı üzerinde kurulmuş bir platformdur. V8 Engine, dolayısıyla NodeJS Single Thread çalışmaktadır. Bu sebeple multi-core sistemlerinizin kapasitesini kullanamamaktasınız. Çok çekirdekli bir sunucuya sahip olup, çalıştırdığınız NodeJS uygulamasının neden sunucunuzun tüm işlemci gücünü kullanamadığına da bu sayede cevap vermiş oluyoruz. 

Fakat çok şanslıyız ki NodeJS ile cluster module kullanabiliyoruz. Bunu da TCP connection’ ı paylaşabilen worker lar vasıtası ile yapıyor.

Peki nasıl oluyor bu iş ? Bana lazım hadi hadi hadi dediğinizi duyar gibiyim. Başlıyoruz.

Önce çok çok basitleştirilmiş düzeyde bir teorik bilgi vericem, ilerde problem yaşarsanız, bu bilgiyi hatırlayarak, problemlere daha sağlıklı yaklaşabilir ve neden problem olmuş olabilir diye düşünürken ki araştırmalarınızı ona göre şekillendirebilirsiniz.

Cluster module bir master kuruyor ve ondan istediğiniz kadar adına worker denen uygulamalar fork luyor. Worker lar birbirleri ile IPC https://en.wikipedia.org/wiki/Inter-process_communication kanalları üzerinden haberleşiyorlar. Ayrıca cluster module dahili load-balancer ile birlikte geliyor. Load balancer da Round-robin algoritmasını https://en.wikipedia.org/wiki/Round-robin_scheduling kullanarak en sağlıklı sonucu almamıza olan sağlıyor.

Yani isteği master alıyor ve IPC kanalları üzerinden eriştiği worker lara TCP’ yi veriyor.

Aslında işin bu teorik kısmını ne ben anlatabildim ve nede şuan sizin çok hakim olabildiğinizi düşünüyorum(Konunun hakimi biri okuyorsa, kendisini tenzih ederim 🙂 ).

Bu iş zaten basit bir iş olmadığı için, işin ehli kişiler PM2 adında bir modül yazıp bize sunmuşlar, yukarıda bahsettiğim işleri, bu module otomatik olarak kendisi yapıyor. Siz sadece Yukarıdaki kavramlara aşina olun yeterli. Eğerki bir gün bir hata ile karşılaşırsanız, hata sözlüğünüzde yukarıdaki ifadeler hazır bulunsun.

Nasıl kullanıyoruz ?

  • Öncelikle global olarak pm2 modülünü https://github.com/Unitech/pm2 sunucumuza kuralım. Bunu komut satırında “npm install pm2 -g” komutunu çalıştırarak gerçekleştiriyoruz.
  • Artık nodejs uygulamamızın start dosyasını pm2 ile çalıştırmamız gerekiyor. Start dosyanız örneğin server.js dosyası olsun. Eskiden node server.js olarak çalıştırıyordunuz, yada forever vb. servisleri kullanıyordunuz. Öncelikle uygulamanızdan kaç adet worker istediğinize karar verin. Teknik olarak istediğiniz kadar yaratabilirsiniz fakat ilk başta mantıklı gözüken çekirdek sayısı kadar yaratmak olacaktır.

    Nasıl yapıyoruz ????
    Aşağıdaki komut ile ;

    Burda server.js az önce de bahsettiğim gibi, nodejs uygulamanızın başlangıç dosyası, -i parametresine verdiğim 4 sayısı ise, yaratılmasını istediğim worker sayısı. İşte bu sayıyı kendinize göre düzenleyin. Bu komutu uyguladıktan sonra nodejs uygulamanız çalışmaya başlayacak ve karşınıza aşağıdakine benzer bir çıktı gelecektir.

    pm4-port-release

    Belirlediğiniz worker sayısına göre sonuç farklılaşacaktır.

  • Eğerki worker larınızdan biri patlarsa, pm2 otomatik olarak onu tekrar başlatacaktır, endişelenmenize gerek yok.
  • İstediğiniz zaman workerlarınızı restart edebilirsiniz. Bunu yapmak için “pm2 restart all” komutunu uygulamanız yeterlidir.
  • Cluster ınızı canlı olarak scale etmenizde çok kolay. Örneğin “pm2 scale app +3” komutunu uyguladığınızda app ismindeki master’ a 3 adet daha worker ekleyecektir.

Production sunucusundaki uygulamayı zero downtime ile update etmek;

Evet can alıcı bir noktaya geldik. Uygulamamız gayet güzel çalışıyor, pek çok kullanıcı kullanıyor ama kodumuzu güncelledik, napıcaz ? uygulamayı restart mı edicez ??? Böyle bir şey yaparsak, o an sitemizde olan herkes erişim kaybına uğrar, veri kayıpları yaşanır vs vs. Peki napıyoruz ?? PM2 modülü üzerinden reload yapıyoruz. Kullanımı çok basit.

Komutumuz : “pm2 reload uygulamaIsmi”

Bu kadar basit.

Peki napıyor bu komut ?

Bütün worker ları birer birer reload ediyor. Bir worker tekrar ayağa kalkmadan diğerini asla reload etmiyor. Bu sayede kademeli bir şekilde uygulamanızın worker larını güncellemiş oluyorsunuz.

Diğer nodejs yazılarında görüşmek üzere 🙂

 

Leave A Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir