Node.js ile Cluster API kullanımı

Bu yazımda sizlere Node.js ve Nest.js özelinde, Cluster kullanarak uygulamalarımızı nasıl scale (ölçeklendirebileceğimizi) anlatmaya çalışacağım. Öncelikle, Cluster nedir ve neden Node.js gibi bir runtime kullanırken buna ihtiyaç duyarız, bunu açıklayalım.

Node.js, doğası gereği tek iş parçacıklı (single-threaded) çalışan bir runtime’dır. Bu, Node.js uygulamanızı herhangi bir işletim sistemi üzerinde çalıştırdığınızda, o sistemde yalnızca tek bir CPU çekirdeğini kullanacağı anlamına gelir. Tek çekirdekli çalışma modeli, düşük kaynak tüketimi gerektiren uygulamalar için avantajlıdır. Ancak, yüksek trafikli ve CPU yoğun işlemlerde Event Loop’un bloklanması riski doğar. Bu durumda, uygulamanızın tamamı kilitlenebilir ve gelen tüm istekler başarısız olur.

Bu kısıtlamaları aşmak ve Node.js uygulamalarını çok çekirdekli işlemcilerde daha verimli çalıştırmak için Cluster API kullanılır. Cluster, aynı Node.js kodunu birden fazla çekirdekte paralel olarak çalıştırarak ölçeklenebilirlik ve yük dengeleme sağlar.

Neden Cluster Modülüne İhtiyacımız Var?

Node.js, non-blocking I/O yapısı sayesinde yüksek performanslı uygulamalar geliştirmek için oldukça yaygın bir tercih haline gelmiştir. Bu özellik, özellikle HTTP istekleri, veritabanı sorguları ve diğer I/O yoğun işlemler için hız ve performans açısından büyük avantajlar sağlar. Asenkron çalışma modeli, bu tür işlemlerin arka planda gerçekleşmesine olanak tanır ve uygulamanın ana işleyişini aksatmadan daha fazla iş yapılmasını mümkün kılar.

Ancak konu CPU yoğun işlemlere (örneğin, şifreleme, karmaşık matematiksel hesaplamalar veya video işleme) geldiğinde, Node.js’in tek iş parçacıklı (single-threaded) doğası bir engel haline gelir. Bu tür işlemler, Event Loop’u bloke edebilir, yani başka hiçbir işlemin gerçekleştirilmesine izin vermeden tüm kaynakları tüketebilir.

Node.js, tek iş parçacıklı (single-threaded) yapısının neden olduğu performans problemlerini aşmak için iki güçlü alternatif sunar: Cluster API ve Worker Threads. Bu yöntemler, farklı kullanım senaryolarında Node.js’in daha verimli çalışmasını sağlar.

Giriş

Bu yazıda, Node.js içerisinde built-in (yerleşik) olarak gelen Cluster API’nin avantajlarını ve dezavantajlarını inceleyip, gerçek hayatta nasıl kullanılabileceğini anlamaya çalışacağız. Ayrıca, Nest.js framework’ü kullanarak Cluster API’yi uygulamalarımıza entegre edeceğimiz bir örnek geliştireceğiz.

Cluster API nedir?

Cluster API, Node.js uygulamalarımızın farklı CPU çekirdeklerini paralel olarak kullanmasına olanak tanır. Bu, aynı uygulamanın birden fazla süreçte çalışmasını sağlayarak performansı artırır ve ölçeklenebilirlik sağlar. Cluster API, birden fazla işlem oluştururken, tüm süreçlerin aynı sunucu portunu paylaşmasına olanak tanır.

Bu sayede, uygulamamıza gelen HTTP istekleri, farklı süreçler arasında eş zamanlı olarak işlenebilir. Cluster API, gelen isteklerin iş yükünü CPU çekirdekleri arasında dağıtarak, Event Loop’un bloke olmasını önler. Özellikle, CPU’ya bağlı görevler veya ağ trafiği yoğun uygulamalarda, bu özellik uygulamanın yanıt süresini optimize eder.

Tüm thread’lerin aynı portları paylaşması, web servisleri gibi yüksek trafikli uygulamalar için idealdir. Bu yapı sayesinde, gelen istekler yük dengesi sağlanarak etkin bir şekilde işlenir, böylece hem kaynak kullanımı optimize edilir hem de yanıt süresi düşürülür.

Dilerseniz gerekli açıklamaları yaptıktan sonra ise bir Nest.js uygulaması oluşturalım ve Cluster API servisini nasıl kullanabileceğimizi görmüş olalım.

nest new nest-cluster

komutu ile uygulamamızı oluşturalım.

Nest.js uygulamamız bu şekilde 3000 portunu dinleyecek şuanda uygulamamız single thread olarak çalışıyor.
src klasörümüz içerisine src > clustering.ts dosyamızı oluşturalım

Örnek Cluster modümüz bu şekilde main.ts dosyamızda yapılandırmamızı da bu şekilde düzenleyelim.

uygulamamızı çalıştırdığımızda ise Cluster API’ları uygulamamızda çalışacaktır. Projenin tüm kodlarını bu repodan bulabilirsiniz iyi çalışmalar dilerim.

Ayrıca beni takip etmek için;

https://www.linkedin.com/in/tarik-sogukpinar/
https://me.tariksogukpinar.dev/