Meteor 3.5, geliştiricilerin tek bir ortam değişkeniyle SockJS yerine uWebSockets.js kullanmasına olanak tanıyarak, metod çağrılarına yoğun şekilde dayanan uygulamalar için gözle görülür şekilde daha düşük CPU, RAM ve çöp toplama (garbage-collection) maliyetleri vaat ediyor.

Bu değişiklik neden önemli

Meteor, lansmanından bu yana her DDP (Distributed Data Protocol) mesajını, her yerde çalışan ancak ham hız için tasarlanmamış bir JavaScript yedekleme mekanizması olan SockJS üzerinden yönlendiriyordu. Yeni sürüm, taşıma katmanını (transport layer) birbirinden ayırarak, DDP'nin beklentilerine uyan herhangi bir WebSocket uygulamasını kabul eden bir eklenti noktası sunuyor. Başlatma sırasında DDP_TRANSPORT=uws ayarını yapmak, varsayılanı yüksek veri akışı (throughput) ile bilinen, C/C++ tabanlı bir sunucu olan uWebSockets.js ile değiştirir.

Performans boyutu

Sürümle birlikte sunulan kıyaslamalar (benchmarks) şunları gösteriyor:

  • CPU kullanımı %9 azaldı
  • RAM tüketimi %11 azaldı
  • Çöp toplama (garbage-collection) duraklama süresi %26 azaldı
  • Mikro kıyaslamalarda veri akışı (throughput) 1.6 kat arttı

Bu kazanımlar, bir uygulama çok sayıda RPC tarzı metod çağrısı yaptığında ortaya çıkıyor. Taşıma katmanının kendisi, ancak uygulamanın iş mantığı (business logic) optimize edildikten sonra bir darboğaz haline gelir; bu nedenle geçiş, doğrudan daha düşük sunucu maliyetlerine dönüşebilir.

Bugün nasıl deneyebilirsiniz

Ayrı bir ikili dosyaya (binary) gerek yok—sadece Meteor 3.5 yeterli. Uygulamayı şu şekilde çalıştırın:

DDP_TRANSPORT=uws meteor run

uWebSockets.js sunucusu kendi portu üzerinden (varsayılan 5001) dinleme yapar. Birden fazla Meteor örneği (instance) aynı ana bilgisayarı paylaştığında, çakışmaları önlemek için her birine METEOR_SETTINGS aracılığıyla farklı bir uws.port atanmalıdır.

Kimler faydalanır ve kimler çok fark görmeyebilir

  • RPC ağırlıklı iş yükleri – istek başına çok sayıda metod çağıran servisler, CPU döngülerinden ve bellekten tasarruf ederek ölçeklendirme baskısını hafifletebilir.
  • Pub/Sub odaklı uygulamalar – yayınla/abone ol (publish/subscribe) modellerindeki gecikmenin çoğu taşıma katmanından değil, veri farkı (data-diff) hesaplamalarından kaynaklanır; bu nedenle hız artışı mütevazı düzeydedir.

Değişiklik isteğe bağlıdır (opt-in); SockJS varsayılan olarak kalmaya devam ederek, yerel WebSockets'in mevcut olmadığı ortamlarla uyumluluğu korur.

Ödünler ve dikkat edilmesi gerekenler

Taşıma katmanını değiştirmek küçük bir operasyonel adım ekler: fazladan bir portu yönetmek ve bunun diğer hizmetlerle çakışmadığından emin olmak. uWebSockets.js yerel bir modül olduğu için, ikili bağımlılıkların (binary dependencies) getirdiği olağan hususları beraberinde getirir; derleme araçları (build tools) dağıtım ana bilgisayarında mevcut olmalı ve kütüphaneye yapılacak gelecekteki tüm güncellemeler uygulamanın kod tabanına karşı test edilmelidir.

Meteor'un taşıma katmanı için sırada ne var

Meteor, temiz bir sınır (boundary) sunarak topluluğu; ister özel güvenlik gereksinimleri, ister özel protokol uzantıları veya daha fazla performans ayarı için olsun, alternatif taşıma katmanlarıyla denemeler yapmaya davet ediyor. Üçüncü taraf uygulamaların ne kadar hızlı ortaya çıkacağını izlemek, eklenebilir (pluggable) modelin Meteor mimarisinin kalıcı bir parçası olup olmayacağını gösterecektir.

Özet: Meteor 3.5'in eklenebilir DDP taşıma katmanı, tek bir komutla eski SockJS yığınını uWebSockets.js ile değiştirmenize olanak tanır; bu sayede hız artışına ihtiyaç duymayan iş yükleri için mevcut kurulumu bozmadan, RPC yoğunluklu uygulamalar için 1.6 kata kadar daha yüksek veri akışı ve ölçülebilir kaynak tasarrufu sağlar.