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 mesajlaşma ve anlık bildirim altyapısı kurma rehberi. Dijital ajans projeleri ve ölçeklenebilir mimariler için adım adım uygulama.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

Modern Web ve Gerçek Zamanlı İletişim İhtiyacı

Geleneksel HTTP istek-cevap döngüsü anlık veri akışı için yetersiz. HTTP polling sunucuya gereksiz yük bindirir. WebSocket tam çift yönlü (full-duplex) tek TCP bağlantısı sağlar. Gecikme düşer, bant genişliği korunur. Bu rehber, canlı bildirim ve sohbet mimarisini sıfırdan kurma adımlarını içerir. Güncel trendler doğrultusunda dijital ajans ekiplerinin ve geliştiricilerin yüksek trafikli modern web ürünlerinde kullanabileceği yalın yapıyı hedefler.

1. Adım: WebSocket Sunucusunu Başlatma

Node.js ortamında harici ağır framework yerine hafif ws kütüphanesi yeterli. Minimum bağımlılık, maksimum performans.

Gereksinimler ve Kurulum

npm install ws

Sunucu Kodu (server.js)

const { WebSocketServer } = require('ws');

const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', (ws) => {
  console.log('İstemci bağlandı.');

  ws.on('message', (rawMessage) => {
    let data;
    try {
      data = JSON.parse(rawMessage);
    } catch (e) {
      return;
    }

    // Tüm istemcilere yayın (broadcast)
    wss.clients.forEach((client) => {
      if (client.readyState === 1) { // 1 = OPEN
        client.send(JSON.stringify(data));
      }
    });
  });

  ws.on('close', () => console.log('İstemci ayrıldı.'));
});

console.log('WebSocket sunucusu ws://localhost:8080 üzerinde aktif.');

2. Adım: İstemci (Browser Native) Entegrasyonu

Modern tarayıcılar WebSocket API'yi yerel olarak destekler. Kütüphaneye gerek yok.

const socket = new WebSocket('ws://localhost:8080');

socket.addEventListener('open', () => {
  socket.send(JSON.stringify({ type: 'CHAT_MESSAGE', text: 'Merhaba dünya!' }));
});

socket.addEventListener('message', (event) => {
  const payload = JSON.parse(event.data);
  console.log('Gelen bildirim:', payload);
});

socket.addEventListener('close', () => {
  console.log('Bağlantı koptu. Yeniden bağlanma planla.');
});

3. Adım: Kimlik Doğrulama (Handshake Auth)

Mesajlaşma kanalları anonim bırakılamaz. Bağlantı kurulurken HTTP Upgrade aşamasında token doğrula. Yetkisiz istemciyi soket açılmadan reddet.

const http = require('http');
const { WebSocketServer } = require('ws');
const url = require('url');

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

server.on('upgrade', (request, socket, head) => {
  const { query } = url.parse(request.url, true);
  const token = query.token;

  // Örnek doğrulama. Gerçekte JWT doğrula.
  if (!token || token !== 'GECERLI_GIZLI_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);
  });
});

server.listen(8080);

4. Adım: Bağlantı Canlılığı (Heartbeat / Ping-Pong)

Kopuk istemcileri temizle. Bellek sızıntısını önle.

  • Her 30 saniyede bir istemciye ping gönder.
  • Cevap dönmeyen (pong göndermeyen) soketleri kapat (terminate).
function heartbeat() {
  this.isAlive = true;
}

wss.on('connection', (ws) => {
  ws.isAlive = true;
  ws.on('pong', 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));

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

Tek sunucu sınırına ulaşıldığında Redis Pub/Sub kullan. Farklı Node.js örneklerine bağlı istemciler aynı mesajları alır.

Mimaride birden çok WebSocket sunucusu varsa, sunucular arası mesaj yönlendirmesi için Redis Pub/Sub standart çözümdür.

Özet Kontrol Listesi

  • Protokol Güvenliği: Canlı ortamda mutlaka wss:// (TLS) kullan.
  • Yeniden Bağlanma (Reconnection): İstemcide üssel geri çekilme (exponential backoff) uygula.
  • Girdi Doğrulama: Gelen her JSON mesajının şemasını sunucuda kontrol et.