WebSockets ile Gerçek Zamanlı Bildirim ve Mesajlaşma Altyapısı Kurulumu Rehberi
Modern web uygulamalarında düşük gecikmeli veri iletişimi sağlayan WebSockets altyapısı kurulumu, ölçekleme adımları ve mimari optimizasyon rehberi.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
WebSockets Nedir ve Neden Tercih Edilmeli?
Geleneksel HTTP istek-yanıt modeli, tek yönlüdür ve her veri transferinde TCP el sıkışması ek yükü üretir. Modern web mimarilerinde anlık bildirim, sohbet ve canlı veri akışları için çift yönlü (full-duplex) ve kalıcı bir TCP kanalı şarttır. WebSockets, tek bir TCP bağlantısı üzerinden istemci ile sunucu arasında milisaniye seviyesinde veri iletimi sağlar.
HTTP Polling veya Long-Polling yerine WebSockets kullanmak, sunucu CPU yükünü ve bant genişliği tüketimini %80'e kadar azaltır.
Adım 1: Temel WebSocket Sunucusunun Kurulması (Node.js)
Minimal ve yüksek performanslı bir sunucu için hafif ws kütüphanesi yeterlidir. Harici karmaşık framework'ler yerine doğrudan yerel HTTP modülü ile entegre çalışır.
Gerekli Paketler
- Node.js LTS
wspaketi
Sunucu Kodu Örneği
const http = require('http');
const WebSocket = require('ws');
const server = http.createServer();
const wss = new WebSocket.Server({ noServer: true });
server.on('upgrade', (request, socket, head) => {
// ponytail: Kimlik dogrulama token kontrolu burada yapilmali
wss.handleUpgrade(request, socket, head, (ws) => {
wss.emit('connection', ws, request);
});
});
wss.on('connection', (ws) => {
ws.isAlive = true;
ws.on('pong', () => { ws.isAlive = true; });
ws.on('message', (data) => {
const payload = JSON.parse(data);
// Mesaj yayini
wss.clients.forEach((client) => {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(payload));
}
});
});
});
// Heartbeat mekanizmasi
setInterval(() => {
wss.clients.forEach((ws) => {
if (!ws.isAlive) return ws.terminate();
ws.isAlive = false;
ws.ping();
});
}, 30000);
server.listen(8080);Adım 2: Dayanıklı İstemci (Client) Bağlantısı ve Heartbeat
Ağ kopmalarında bağlantının otomatik yenilenmesi (exponential backoff) ve ölü bağlantıların tespiti için istemci tarafında yerel WebSocket API kullanılır.
İstemci İmplementasyonu
let socket;
let reconnectInterval = 1000;
function connect() {
socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
console.log('Baglanti kuruldu.');
reconnectInterval = 1000;
};
socket.onmessage = (event) => {
const message = JSON.parse(event.data);
renderNotification(message);
};
socket.onclose = () => {
setTimeout(connect, Math.min(reconnectInterval *= 2, 30000));
};
socket.onerror = (err) => {
socket.close();
};
}Adım 3: Redis Pub/Sub ile Yatay Ölçekleme (Horizontal Scaling)
Birden fazla sunucu örneği (instance) çalıştığında, A sunucusundaki kullanıcı B sunucusundaki kullanıcıya mesaj gönderemez. Bu problemi çözmek için araya Redis Pub/Sub mimarisi eklenir.
- Yayıncı (Publisher): İstemciden gelen mesajı Redis kanalına iletir.
- Abone (Subscriber): Diğer sunucu örnekleri Redis kanalını dinler ve kendi bağlı istemcilerine veriyi iletir.
Adım 4: Güvenlik ve Kimlik Doğrulama (Auth)
WebSocket protokolünde özel HTTP başlıkları doğrudan gönderilemez. Güvenli bağlantı için şu standartlar uygulanmalıdır:
- WSS Protokolü: Trafiğin TLS/SSL üzerinden şifrelenmesi (Port 443).
- Ticket/Token Bazlı Handshake: Upgrade isteğinde query parametresi veya çerez ile tek kullanımlık bilet doğrulaması.
- Rate Limiting: IP ve kullanıcı başına saniyelik mesaj sınırı uygulanması.
Modern Web ve Dijital Ajans Projelerinde Trendler
Bir dijital ajans için gerçek zamanlı özellikler; e-ticaret stok güncellemeleri, canlı destek panelleri ve SaaS ürünlerinin etkileşimini artırır. Güncel trendler, WebSocket yönetimini Edge Functions (Cloudflare Workers, Fastly) ve sunucusuz mimariler ile birleştirerek gecikmeyi 20ms altına düşürmeye odaklanmaktadır.
Özet Kontrol Listesi
- Kalıcı bağlantı için TCP Ping/Pong kontrolünü aktif edin.
- Token doğrulamasını HTTP Upgrade aşamasında bitirin.
- Çoklu node dağıtımlarında Redis Pub/Sub adaptörü kullanın.
- WSS (TLS) harici bağlantılara izin vermeyin.