WebSocket ve Uzun Süreli Bağlantılar: Sunucu Tarafında Ne Değişir?

Klasik modelden farkı, alternatif yöntemler, kaynak etkisi, ters vekil ayarları, canlılık sinyali, ölçeklendirme ve güvenlik. WebSocket ve Uzun Süreli…

WebSocket ve Uzun Süreli Bağlantılar: Sunucu Tarafında Ne Değişir?
İçindekiler
  1. Klasik Modelden Farkı
  2. Ne Zaman Gerekli?
  3. Sunucu Kaynak Etkisi
  4. Ters Vekil Yapılandırması
  5. Canlılık Sinyali
  6. Ölçeklendirme Sorunu
  7. Güvenlik Noktaları
  8. Sonuç
  9. Sıkça Sorulan Sorular (SSS)
  10. Gerçek zamanlı özellik için WebSocket şart mı?
  11. Bağlantılar rastgele kopuyor, neden?
  12. Kaç eşzamanlı bağlantı taşıyabilirim?
  13. Birden fazla sunucuya nasıl dağıtırım?

WebSocket ve Uzun Süreli Bağlantılar: Sunucu Tarafında Ne Değişir?

Canlı sohbet, anlık bildirim veya gerçek zamanlı gösterge paneli eklemek istiyorsunuz. Bu özellikler klasik istek-yanıt döngüsünden farklı bir bağlantı modeli gerektirir — ve sunucunuzda farklı bir yük profili oluşturur.

Bu yazı, uzun süreli bağlantıların sunucu tarafındaki etkilerini ele alıyor.

Klasik Modelden Farkı

Normal bir web isteği kısa ömürlüdür: istek gelir, yanıt gider, bağlantı kapanır. WebSocket bunu tersine çevirir:

  • Bağlantı açık kalır. Dakikalar, saatler boyunca.
  • İki yönlü iletişim vardır. Sunucu da mesaj başlatabilir.
  • Her bağlantı bellek tüketir. Boşta dursa bile.
  • Durum sunucuda tutulur. Kim nerede bağlı?

Dördüncü madde en önemli mimari sonucu doğurur: klasik web uygulamaları durumsuzdur, WebSocket ise doğası gereği durumludur.

Bu fark, ölçeklendirme yaklaşımınızı tamamen değiştirir — istekleri rastgele dağıtamazsınız, çünkü kullanıcının bağlantısı belirli bir sunucuda durur.

Ne Zaman Gerekli?

Her gerçek zamanlı görünen özellik WebSocket gerektirmez:

İhtiyaç Uygun yöntem
Dakikada bir güncelleme Basit periyodik sorgu
Tek yönlü bildirim akışı Sunucu gönderimli olaylar
Çift yönlü, sık mesajlaşma WebSocket
Nadir ama anlık bildirim Anlık bildirim servisi

İkinci satır sıkça atlanan bir seçenektir: yalnızca sunucudan istemciye veri akıyorsa, sunucu gönderimli olaylar WebSocket'ten daha basittir ve normal HTTP altyapısı üzerinde çalışır.

Birinci satır ise dürüst bir değerlendirmedir. Güncelleme sıklığınız düşükse, düzenli aralıklarla yapılan basit bir sorgu hem daha az kaynak tüketir hem daha az karmaşıklık getirir.

Sunucu Kaynak Etkisi

Uzun süreli bağlantıların kaynak profili şöyledir:

  1. Bellek doğrusal artar. Bağlantı başına sabit bir maliyet.
  2. CPU düşük kalır. Mesaj akmadığı sürece.
  3. Dosya tanıtıcısı tüketilir. Sistem sınırına takılabilirsiniz.
  4. Bağlantı sayısı port sınırına dayanabilir.

Üçüncü madde ilk karşılaşılan duvardır: işletim sistemi varsayılan olarak süreç başına açık dosya sayısını sınırlar ve her bağlantı bir dosya tanıtıcısı tüketir.

Bu sınır artırılabilir ancak varsayılan değerlerle birkaç bin bağlantıda tıkanırsınız. Yapılandırmayı önceden ayarlamak gerekir — VDS altyapısı üzerinde bu sistem sınırlarına doğrudan müdahale edebilirsiniz.

Ters Vekil Yapılandırması

Uygulamanızın önünde bir ters vekil varsa ek ayar gerekir:

  • Yükseltme başlıkları iletilmelidir. Bağlantı protokol değiştirir.
  • Zaman aşımı süreleri uzatılmalıdır. Varsayılanlar çok kısadır.
  • Tamponlama kapatılmalıdır. Mesajlar gecikmesin.
  • Bağlantı sayısı sınırları gözden geçirilmelidir.

İkinci madde en sık yaşanan sorunun kaynağıdır: ters vekilin varsayılan zaman aşımı süresi genellikle bir dakikadır ve boştaki WebSocket bağlantısı bu sürede kapatılır.

Kullanıcı tarafında bu, bağlantının rastgele kopması olarak görünür. Çözüm iki yönlüdür: vekildeki süreyi uzatmak ve uygulamada düzenli canlılık sinyali göndermek.

Canlılık Sinyali

Açık bağlantıların sağlığını korumak için gereken düzen:

  1. Sunucu düzenli aralıklarla sinyal gönderir
  2. İstemci yanıt verir
  3. Yanıt gelmezse bağlantı ölü sayılır
  4. Kaynaklar serbest bırakılır
  5. İstemci yeniden bağlanmayı dener

Üçüncü madde kaynak sızıntısını önler: ağ kesintisinde bağlantı düzgün kapanmaz ve sunucu tarafında ölü bir kayıt olarak asılı kalır. Canlılık kontrolü olmayan sistemlerde bu kayıtlar birikir.

Beşinci madde istemci tarafı sorumluluğudur ama sunucu tasarımını etkiler: yeniden bağlanma denemeleri kademeli olarak seyrekleşmelidir, aksi hâlde kesinti sonrası tüm istemciler aynı anda bağlanmaya çalışır.

Ölçeklendirme Sorunu

Birden fazla sunucuya geçtiğinizde ortaya çıkan zorluk:

Sorun Çözüm
Kullanıcılar farklı sunucularda Sunucular arası mesaj dağıtımı
Bağlantı hangi sunucuda? Merkezi bağlantı kaydı
Yük dengeleyici dağıtımı Oturum yapışkanlığı
Sunucu yeniden başlarsa İstemci yeniden bağlanmalı

Birinci satır temel zorluktur: A sunucusundaki kullanıcı, B sunucusundaki kullanıcıya mesaj gönderemez — sunucular arasında bir mesaj dağıtım katmanı gerekir.

Bu genellikle bir yayınla-abone ol yapısıyla çözülür: mesaj merkezi bir kanala yazılır, tüm sunucular o kanalı dinler ve kendi bağlantılarına iletir.

Güvenlik Noktaları

Uzun süreli bağlantılarda dikkat edilecekler:

  • Kimlik doğrulama bağlantı kurulurken yapılmalıdır.
  • Yetki değişiklikleri açık bağlantıya yansımalıdır.
  • Mesaj hızı sınırlanmalıdır. Tek istemci sunucuyu boğmasın.
  • Mesaj boyutu sınırlanmalıdır.
  • Şifreli bağlantı kullanılmalıdır.

İkinci madde ince bir açıktır ve gözden kaçar: kullanıcının yetkisi kaldırıldığında, açık duran WebSocket bağlantısı çalışmaya devam eder. Yetki değişikliklerinde ilgili bağlantıların kapatılması gerekir.

Üçüncü madde ise basit bir kötüye kullanımı önler — sınırsız mesaj gönderebilen tek bir istemci, sunucu kaynaklarını tüketebilir.

Sonuç

WebSocket'in getirdiği asıl değişiklik teknik değil mimaridir: klasik web uygulamaları durumsuzdur, uzun süreli bağlantılar ise doğası gereği durumludur ve bu, ölçeklendirme yaklaşımınızı baştan değiştirir. Kurulumda ilk çarpacağınız duvar, işletim sisteminin açık dosya sayısı sınırıdır. İkinci sorun ters vekilde çıkar: varsayılan zaman aşımı genellikle bir dakikadır ve boştaki bağlantıyı kapatır — süreyi uzatın ve canlılık sinyali gönderin. Ayrıca her gerçek zamanlı özellik WebSocket gerektirmez; tek yönlü akış için daha basit yöntemler var.

Sıkça Sorulan Sorular (SSS)

Gerçek zamanlı özellik için WebSocket şart mı?

Değil. Veri yalnızca sunucudan istemciye akıyorsa sunucu gönderimli olaylar daha basittir ve normal HTTP altyapısında çalışır. Güncelleme sıklığınız düşükse periyodik bir sorgu hem daha az kaynak tüketir hem daha az karmaşıklık getirir.

Bağlantılar rastgele kopuyor, neden?

Büyük olasılıkla ters vekilin zaman aşımı süresi. Varsayılan genellikle bir dakikadır ve boştaki bağlantı bu sürede kapatılır. Vekildeki süreyi uzatın ve uygulamada düzenli canlılık sinyali gönderin.

Kaç eşzamanlı bağlantı taşıyabilirim?

Öncelikle işletim sisteminin açık dosya sayısı sınırına takılırsınız — varsayılan değerlerle birkaç bin bağlantıda tıkanırsınız. Bu sınır artırılabilir; asıl kısıt sonrasında bellektir, çünkü her bağlantı boşta dursa bile sabit bir bellek maliyeti taşır.

Birden fazla sunucuya nasıl dağıtırım?

Yük dengeleyicide oturum yapışkanlığı açın ki kullanıcı hep aynı sunucuya gitsin. Ayrıca sunucular arası bir mesaj dağıtım katmanı kurun — aksi hâlde farklı sunuculardaki kullanıcılar birbirine mesaj gönderemez.