Node.js İle Websocket Üzerinden Anlık Kullanıcı Takip Sistemi Nasıl Yapılır?

Node.js İle Websocket Üzerinden Anlık Kullanıcı Takip Sistemi Nasıl Yapılır?
Node.js İle Websocket Üzerinden Anlık Kullanıcı Takip Sistemi Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Projeye başlamadan önce sisteminizde Node.js'in en güncel LTS (Long Term Support) sürümünün yüklü olması gerekmektedir. Terminal üzerinden node -v komutu ile sürümünüzü kontrol edebilirsiniz. Ayrıca, paket yönetimi için npm veya pnpm kullanacağız.

Proje klasörünüzü oluşturun ve gerekli bağımlılıkları yükleyin:

mkdir kullanici-takip-sistemi
cd kullanici-takip-sistemi
npm init -y
npm install express socket.io

Bu kurulum, web sunucumuzu yönetmek için Express ve gerçek zamanlı iletişim için Socket.io kütüphanelerini projenize dahil edecektir.

Sunucu Tarafı Yapılandırması

Sunucu tarafında, Express uygulamamızı bir HTTP sunucusu ile sarmalayarak Socket.io'nun bu sunucu üzerinde çalışmasını sağlayacağız. Bu yapı, hem statik dosyaları sunmamıza hem de Websocket bağlantılarını dinlememize olanak tanır.

const express = require('express');
const http = require('http');
const { Server } = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = new Server(server);

io.on('connection', (socket) => {
    console.log('Yeni kullanıcı bağlandı: ', socket.id);

    socket.on('disconnect', () => {
        console.log('Kullanıcı ayrıldı: ', socket.id);
    });
});

server.listen(3000, () => {
    console.log('Sunucu 3000 portunda çalışıyor.');
});

Burada io.on('connection') bloğu, her yeni bağlantıda tetiklenir. socket.id, her kullanıcıya özel atanan benzersiz bir tanımlayıcıdır.

İstemci Tarafında Bağlantı Kurulumu

İstemci tarafında, sunucuya bağlanmak için Socket.io'nun istemci kütüphanesini kullanacağız. HTML dosyanızın içine Socket.io istemci scriptini ekleyerek bağlantıyı başlatabilirsiniz.



  const socket = io();

  socket.on('connect', () => {
    console.log('Sunucuya bağlandınız, ID:', socket.id);
  });

Bu kod bloğu, sayfa yüklendiği anda istemcinin sunucuyla el sıkışmasını sağlar. socket.id ile istemci tarafında da kendi benzersiz kimliğinizi görebilirsiniz.

Anlık Kullanıcı Hareketlerini İzleme

Kullanıcıların sayfada ne yaptığını (örneğin fare hareketi veya tıklama) takip etmek için istemciden sunucuya veri göndermemiz gerekir. Bu verileri emit metodu ile göndeririz.

// İstemci tarafında
document.addEventListener('mousemove', (e) => {
    socket.emit('user-move', { x: e.clientX, y: e.clientY });
});

// Sunucu tarafında
socket.on('user-move', (data) => {
    socket.broadcast.emit('update-user-position', {
        id: socket.id,
        coords: data
    });
});

Burada socket.broadcast.emit kullanarak, veriyi gönderen kişi hariç diğer tüm bağlı kullanıcılara bu hareket bilgisini iletiyoruz. Bu, anlık bir "mouse takip" sistemi için temel oluşturur.

Veri İletişim Yöntemlerinin Karşılaştırılması

Yöntem Avantaj Dezavantaj
HTTP Polling Basit yapı Yüksek sunucu yükü, gecikme
Websocket Düşük gecikme, çift yönlü Bağlantı yönetimi gerektirir
Server-Sent Events Tek yönlü akış Sadece sunucudan istemciye

Güvenlik ve Ölçeklendirme Uyarıları

Kritik Güvenlik Uyarısı: Websocket bağlantılarında XSS (Cross-Site Scripting) saldırılarına karşı gelen verileri her zaman doğrulayın. Socket.io üzerinde 'cors' ayarlarını yaparak sadece izin verdiğiniz domainlerin bağlanmasına izin verin. Üretim ortamında (production) mutlaka HTTPS protokolünü kullanın.

Ölçeklendirme yaparken, tek bir sunucunun kapasitesini aştığınızda "Redis Adapter" kullanarak birden fazla Node.js örneği arasında mesajlaşmayı senkronize etmeniz gerektiğini unutmayın.

Sıkça Sorulan Sorular

Websocket bağlantısı neden kopuyor?

Genellikle ağ kesintileri veya sunucu tarafındaki 'heartbeat' (kalp atışı) zaman aşımı ayarlarıyla ilgilidir. İstemci tarafında otomatik yeniden bağlanma (reconnection) özelliğini Socket.io varsayılan olarak yönetir.

Kullanıcı sayısı arttıkça sistem yavaşlar mı?

Evet, her kullanıcı için bir socket nesnesi bellek tüketir. Çok yüksek trafikli sistemlerde Redis kullanarak sunucu yükünü dağıtmak şarttır.

Veri gizliliği nasıl sağlanır?

Hassas verileri asla doğrudan socket üzerinden göndermeyin. Gerekirse JWT (JSON Web Token) kullanarak bağlantı sırasında kimlik doğrulama yapın.

Socket.io yerine neden 'ws' kütüphanesi kullanmayayım?

Socket.io; otomatik yeniden bağlanma, oda yönetimi (rooms) ve fallback mekanizmaları gibi hazır özellikler sunar. 'ws' daha düşük seviyelidir ve bu özellikleri kendiniz yazmanız gerekir.

Canlı takip sistemlerinde veritabanı kullanımı gerekli mi?

Sadece anlık takip için RAM üzerinde tutulan veriler yeterlidir. Ancak geçmişe dönük analiz yapacaksanız verileri bir veritabanına loglamanız gerekir.

Socket.io ile Oda Bazlı İzolasyon ve Gruplandırma

Canlı takip sistemlerinde tüm kullanıcıların hareketlerini tek bir kanaldan yayınlamak, özellikle binlerce aktif kullanıcının olduğu senaryolarda ciddi bir performans kaybına ve gereksiz veri trafiğine yol açar. Socket.io'nun "Rooms" (odalar) yapısı, verileri sadece ilgili kullanıcılara veya yöneticilere iletmenizi sağlar.

Örneğin, bir admin panelinde sadece belirli bir bölgedeki veya belirli bir sayfadaki kullanıcıları izlemek istediğinizde şu yapıyı kullanabilirsiniz:

// Sunucu tarafında kullanıcıyı bir odaya dahil etme
io.on('connection', (socket) => {
  socket.on('join-room', (roomName) => {
    socket.join(roomName);
    console.log(`Kullanıcı ${roomName} odasına katıldı.`);
  });

  // Sadece o odadaki kullanıcılara veri gönder
  socket.on('user-move', (data) => {
    socket.to('admin-panel').emit('update-location', data);
  });
});

Canlı Takip Sistemlerinde Performans Optimizasyonu

Anlık verilerle çalışırken sunucunun CPU ve RAM kullanımını optimize etmek, sistemin çökmesini engeller. Özellikle yüksek frekanslı veri gönderimlerinde (örneğin her fare hareketinde bir paket gönderilmesi) "Throttling" veya "Debouncing" teknikleri hayat kurtarıcıdır.

Veri Gönderimini Sınırlandırma (Throttling)

Kullanıcının her milisaniyedeki hareketini sunucuya göndermek yerine, veriyi belirli aralıklarla (örneğin 200ms) biriktirip göndermek ağ trafiğini %80 oranında azaltabilir.

// İstemci tarafında throttle uygulaması
let lastEmit = 0;
document.addEventListener('mousemove', (e) => {
  const now = Date.now();
  if (now - lastEmit > 200) {
    socket.emit('user-move', { x: e.clientX, y: e.clientY });
    lastEmit = now;
  }
});

Payload Boyutunu Küçültme

Gönderdiğiniz JSON nesnelerinin boyutunu küçültmek için uzun anahtar isimleri yerine kısa kısaltmalar kullanın. Örneğin { "latitude": 41.0082, "longitude": 28.9784 } yerine { "lat": 41.0082, "lng": 28.9784 } kullanmak, milyonlarca pakette ciddi bir bant genişliği tasarrufu sağlar.

Üretim Ortamına (Deployment) Geçişte Dikkat Edilmesi Gerekenler

Geliştirme ortamında çalışan sisteminiz, canlıya alındığında farklı zorluklarla karşılaşabilir. Özellikle Nginx gibi bir ters vekil sunucu (reverse proxy) kullanıyorsanız, WebSocket bağlantılarının doğru yönlendirildiğinden emin olmalısınız.

  • Sticky Sessions: Socket.io, bağlantı kurulurken HTTP uzun sorgulama (polling) kullanabilir. Birden fazla sunucu (load balancer) kullanıyorsanız, aynı kullanıcının her zaman aynı sunucuya yönlendirilmesi (sticky session) şarttır.
  • Redis Adapter: Eğer uygulamanızı birden fazla sunucuya ölçeklendirirseniz, sunucular arası haberleşme için @socket.io/redis-adapter paketini kullanmanız gerekir. Bu sayede A sunucusuna bağlı bir kullanıcı, B sunucusuna bağlı bir admin tarafından izlenebilir.
  • SSL/TLS: WebSocket bağlantılarını mutlaka wss:// protokolü üzerinden, yani SSL sertifikası ile çalıştırın. Aksi takdirde tarayıcılar güvenlik nedeniyle bağlantıyı reddedecektir.
// Redis Adapter yapılandırması
const { createClient } = require('redis');
const { createAdapter } = require('@socket.io/redis-adapter');

const pubClient = createClient({ url: 'redis://localhost:6379' });
const subClient = pubClient.duplicate();

Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
  io.adapter(createAdapter(pubClient, subClient));
});

Sonuç

Node.js ve Socket.io kullanarak anlık bir kullanıcı takip sistemi kurmak, doğru mimari ile oldukça verimli bir süreçtir. Bu rehberde temel bağlantı kurulumundan, verilerin broadcast edilmesine kadar olan süreci inceledik. Bir sonraki adımda, kullanıcıları belirli "odalar" (rooms) içine alarak sadece belirli grupları izlemeyi veya Socket.io'nun adapter yapısını kullanarak sistemi yatayda ölçeklendirmeyi deneyebilirsiniz.

Not: Uygulamanızın güvenliği için her zaman en güncel paketleri kullanın ve kullanıcı girişlerini sunucu tarafında mutlaka sanitize edin.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Teknoloji ve yazılım kullanımı üzerine pratik kılavuzlar hazırlıyorum. Karmaşık dijital araçları, herkesin hızlıca öğrenebileceği sade rehberler haline getirmekte uzmanım.

Yorumlar (0)

Yorum Yaz