IHS Strategic
Tüm Blog Yazıları
HowTo09 Eylül 2026•3 dk okuma

WebSockets ile Gerçek Zamanlı Bildirim ve Mesajlaşma Altyapısı Kurulum Rehberi

Modern web uygulamalarında düşük gecikmeli, iki yönlü iletişim sağlayan WebSocket altyapısının adım adım kurulum rehberi.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

WebSockets Nedir ve Neden Gereklidir?

Geleneksel HTTP istek-yanıt modeli tek yönlüdür. İstemci talep eder, sunucu yanıt verir. Gerçek zamanlı bildirim ve mesajlaşma sistemlerinde HTTP polling (yoklama) bant genişliği israfına ve yüksek gecikmeye yol açar.

WebSocket protokolü (RFC 6455), tek TCP bağlantısı üzerinden tam çift yönlü (full-duplex) iletişim kanalı açar. El sıkışma (handshake) sonrası HTTP başlık yükü kalkar. Düşük gecikme ve minimum kaynak kullanımı sağlanır.

Modern Web Trendleri ve Dijital Ajans Perspektifi

Modern web mimarisinde kullanıcı deneyimi hız ve anlık geri bildirim üzerine kuruludur. Dijital ajans projelerinde, e-ticaret stok güncellemeleri, anlık destek sohbetleri ve panellerde WebSockets standart haline gelmiştir.

Trend: Sunucusuz (serverless) ortamlarda WebSocket yönetimi için edge adapter ve managed pub/sub servisleri tercih edilir. Ancak çekirdek mantığı anlamak için yerel TCP soket mimarisini kurmak esastır.

Gereksinimler

  • Node.js (LTS sürümü)
  • ws paketi (Hafif ve standartlara tam uyumlu WebSocket kütüphanesi)
  • Modern web tarayıcısı (Native WebSocket API destekli)

Adım 1: WebSocket Sunucusu Kurulumu

Gereksiz bağımlılıklardan kaçının. Node.js yerel http modülü ile ws kütüphanesini entegre edin.

const http = require('http');
const WebSocket = require('ws');

const server = http.createServer();
const wss = new WebSocket.Server({ noServer: true });

// Kimlik doğrulama ve upgrade yönetimi
server.on('upgrade', (request, socket, head) => {
  // ponytail: Basit auth kontrolü. Prodüksiyonda JWT/Session token doğrula.
  const token = request.headers['sec-websocket-protocol'];
  if (!token) {
    socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
    socket.destroy();
    return;
  }

  wss.handleUpgrade(request, socket, head, (ws) => {
    wss.emit('connection', ws, request);
  });
});

wss.on('connection', (ws, req) => {
  ws.isAlive = true;
  ws.on('pong', () => { ws.isAlive = true; });

  ws.on('message', (data) => {
    let parsed;
    try {
      parsed = JSON.parse(data);
    } catch (e) {
      return;
    }
    
    // Mesaj yayını (Broadcast)
    wss.clients.forEach((client) => {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify(parsed));
      }
    });
  });
});

// Ölü bağlantıları temizleme (Heartbeat)
const interval = setInterval(() => {
  wss.clients.forEach((ws) => {
    if (ws.isAlive === false) return ws.terminate();
    ws.isAlive = false;
    ws.ping();
  });
}, 30000);

wss.on('close', () => clearInterval(interval));
server.listen(8080);

Adım 2: İstemci (Client) Tarafı Entegrasyonu

İstemcide harici kütüphaneye gerek yoktur. Standart tarayıcı WebSocket API kullanılır. Bağlantı kopmalarına karşı üstel geri çekilme (exponential backoff) stratejisi uygulanmalıdır.

class RealtimeClient {
  constructor(url, token) {
    this.url = url;
    this.token = token;
    this.reconnectAttempts = 0;
    this.connect();
  }

  connect() {
    this.ws = new WebSocket(this.url, this.token);

    this.ws.onopen = () => {
      this.reconnectAttempts = 0;
    };

    this.ws.onmessage = (event) => {
      try {
        const data = JSON.parse(event.data);
        this.handleNotification(data);
      } catch (err) {
        // Format hatası
      }
    };

    this.ws.onclose = () => {
      const timeout = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);
      this.reconnectAttempts++;
      setTimeout(() => this.connect(), timeout);
    };
  }

  send(payload) {
    if (this.ws.readyState === WebSocket.OPEN) {
      this.ws.send(JSON.stringify(payload));
    }
  }

  handleNotification(data) {
    // DOM güncelleme veya bildirim tetikleme
  }
}

Adım 3: Güvenlik ve Doğrulama Kuralları

  • WSS Protokolü: Canlı ortamda şifrelenmemiş ws:// yerine daima TLS korumalı wss:// kullanın.
  • Handshake Doğrulaması: Bağlantı açılmadan önce token kontrolü yapın, geçersiz istekleri soket seviyesinde sonlandırın.
  • Girdi Denetimi (Input Validation): İstemciden gelen her mesajı doğrulanmamış kabul edin ve JSON şemalarını kontrol edin.
  • Hız Sınırlama (Rate Limiting): Soket başına saniye başına düşen mesaj limitini kısıtlayarak DoS riskini önleyin.

Adım 4: Yatay Ölçekleme (Horizontal Scaling)

Tek sunucu üzerinde WebSocket istemcileri bellek sınırına takılır. Çoklu sunucu mimarisinde istemciler arası mesaj dağıtımı için Redis Pub/Sub kullanılır:

  • Her WebSocket düğümü (node) Redis kanalına abone olur.
  • Gelen mesaj önce Redis'e basılır.
  • Tüm sunucular mesajı alıp kendi bağlı istemcilerine dağıtır.

Özet

Hafif, bağımlılıktan uzak ve standartlara bağlı bir WebSocket altyapısı; modern web uygulamalarında düşük gecikmeli, kararlı ve ölçeklenebilir bir gerçek zamanlı veri akışı sağlar.