Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce bilgisayarınızda Node.js'in güncel bir LTS (Long Term Support) sürümünün yüklü olduğundan emin olmalısınız. 2026 yılı standartlarında Node.js 22+ sürümleri önerilmektedir. Proje dizininizi oluşturun ve gerekli paketleri yüklemek için terminalinizi hazırlayın.
# Proje klasörünü oluşturun
mkdir borsa-takip-sistemi
cd borsa-takip-sistemi
# Node.js projesini başlatın
npm init -y
# Gerekli kütüphaneleri yükleyin
npm install express socket.io cors
Yukarıdaki komutlar ile projenin temel yapı taşlarını kurmuş oluyoruz. express sunucu yönetimi için, socket.io çift yönlü iletişim için ve cors ise farklı kaynaklardan gelen istekleri yönetmek için kullanılacaktır.
Sunucu Tarafında WebSocket Kurulumu
Sunucu tarafında Socket.io'yu ayağa kaldırmak, istemcilerin bağlanabileceği bir kanal oluşturmak demektir. Aşağıdaki kod bloğu, temel bir HTTP sunucusu oluşturur ve Socket.io'yu bu sunucuya bağlar.
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const cors = require('cors');
const app = express();
app.use(cors());
const server = http.createServer(app);
const io = new Server(server, {
cors: {
origin: "*", // Üretim ortamında burayı güvenli alanlarla kısıtlayın
methods: ["GET", "POST"]
}
});
io.on('connection', (socket) => {
console.log('Bir kullanıcı bağlandı:', socket.id);
socket.on('disconnect', () => {
console.log('Kullanıcı ayrıldı');
});
});
server.listen(3000, () => {
console.log('Sunucu 3000 portunda çalışıyor...');
});
Bu kodda io.on('connection') bloğu, her yeni bağlantıda tetiklenir. Bağlantı sağlandığında sunucu, istemciyi tanır ve iletişim kanalı açık tutulur.
Simüle Edilmiş Borsa Verisi Üretimi
Gerçek bir borsa API'si yerine, verilerin nasıl aktığını göstermek için rastgele değerler üreten bir fonksiyon yazacağız. Bu fonksiyon, belirli aralıklarla tüm bağlı istemcilere güncel fiyat bilgilerini gönderecektir.
function borsaVerisiGonder() {
setInterval(() => {
const hisseSenedi = {
sembol: 'BTC/USD',
fiyat: (Math.random() * 50000 + 40000).toFixed(2),
zaman: new Date().toLocaleTimeString()
};
io.emit('hisseGuncelleme', hisseSenedi);
}, 2000); // Her 2 saniyede bir veri gönder
}
borsaVerisiGonder();
Burada io.emit metodu, bağlı olan tüm istemcilere veriyi yayınlamak için kullanılır. setInterval fonksiyonu, veri akışını simüle ederek gerçek zamanlı bir borsa ekranı deneyimi sunar.
İstemci Tarafında Veri Karşılama
İstemci tarafında, Socket.io istemci kütüphanesini kullanarak sunucudan gelen verileri dinlememiz gerekir. Basit bir HTML ve JavaScript yapısı ile verileri ekrana yazdıralım.
// client.js
const socket = io('http://localhost:3000');
socket.on('hisseGuncelleme', (data) => {
console.log('Yeni veri:', data);
document.getElementById('fiyat-ekrani').innerText =
`${data.sembol}: ${data.fiyat} USD`;
});
Bu kod bloğu, sunucudan gelen hisseGuncelleme olayını dinler ve gelen veriyi DOM (Document Object Model) üzerinde ilgili alana yansıtır.
Performans ve Ölçeklenebilirlik Karşılaştırması
Gerçek zamanlı uygulamalarda yöntem seçimi, sistemin yük altında nasıl davranacağını belirler. Aşağıdaki tablo, farklı iletişim yöntemlerini karşılaştırmaktadır.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Polling (Sorgulama) | Basit kurulum | Yüksek sunucu yükü, gecikme |
| WebSocket / Socket.io | Düşük gecikme, çift yönlü | Bağlantı yönetimi gerektirir |
| Server-Sent Events | Tek yönlü akış için hafif | Sadece sunucudan istemciye |
Güvenlik ve Üretim Ortamı Uyarıları
Kritik Güvenlik Uyarısı: Üretim ortamında (production)
corsayarlarındaorigin: "*"kullanmak büyük bir güvenlik açığıdır. Sadece güvenilir alan adlarına (domain) izin verin. Ayrıca, Socket.io bağlantılarını korumak için JWT (JSON Web Token) tabanlı kimlik doğrulama mekanizmalarını mutlaka kullanın.
Sıkça Sorulan Sorular
Socket.io yerine neden doğrudan WebSocket kullanmıyoruz?
Socket.io, bağlantı kopmalarında otomatik yeniden bağlanma (reconnection), yedekleme (fallback) mekanizmaları ve oda (room) yönetimi gibi gelişmiş özellikler sunar. Bu, geliştirme sürecini ciddi oranda hızlandırır.
Bu sistem aynı anda kaç kullanıcıyı destekler?
Tek bir Node.js sunucusu, donanım kapasitesine bağlı olarak binlerce eş zamanlı bağlantıyı yönetebilir. Ancak ölçeklenebilirlik için Redis kullanarak Socket.io adaptörü ile sunucuları kümelemeniz (cluster) önerilir.
Veri akışında gecikme olursa ne yapmalıyım?
Gecikmeler genellikle ağ darboğazlarından kaynaklanır. Veri paketlerini küçültün, gereksiz verileri göndermekten kaçının ve sunucu tarafında veri sıkıştırma (compression) tekniklerini aktif edin.
Hisse senedi verilerini nereden almalıyım?
Gerçek bir uygulama için güvenilir finansal veri sağlayıcılarının (Alpha Vantage, Yahoo Finance API, Binance API vb.) WebSocket uç noktalarını kullanmalısınız.
Socket.io bağlantısı neden kesiliyor?
Bağlantı kesilmeleri genellikle sunucu zaman aşımı (timeout) süreleri veya proxy/load balancer ayarlarından kaynaklanır. Socket.io'nun pingTimeout ve pingInterval ayarlarını yapılandırmayı deneyin.
Finansal Sorumluluk Reddi: Bu makalede yer alan kod örnekleri ve borsa verisi simülasyonları tamamen eğitim amaçlıdır. Hiçbir şekilde yatırım tavsiyesi değildir. Finansal piyasalarda işlem yapmak risk içerir; kendi araştırmanızı yapmalı ve profesyonel danışmanlık almalısınız.
Socket.io ile Oda (Room) Yapısı ve Dinamik Abonelik Yönetimi
Borsa uygulamalarında her kullanıcının tüm hisse senetlerini anlık olarak takip etmesi, hem bant genişliği hem de istemci tarafındaki işlemci yükü açısından verimsizdir. Socket.io'nun sunduğu Rooms (Odalar) özelliği, veriyi sadece ilgili hisse senediyle ilgilenen kullanıcılara göndererek trafiği optimize etmenizi sağlar.
Aşağıdaki örnekte, bir kullanıcının belirli bir hisse senedini "takibe alması" durumunda sunucunun nasıl tepki vereceğini görebilirsiniz:
// Sunucu tarafında oda yönetimi
io.on('connection', (socket) => {
socket.on('subscribe', (ticker) => {
socket.join(ticker);
console.log(`Kullanıcı ${ticker} hissesini takibe aldı.`);
});
socket.on('unsubscribe', (ticker) => {
socket.leave(ticker);
});
});
// Veri güncellendiğinde sadece o hisseyi takip edenlere gönder
function broadcastPrice(ticker, price) {
io.to(ticker).emit('priceUpdate', { ticker, price });
}
Bu yapı sayesinde, binlerce hisse senedinin olduğu bir sistemde, istemci sadece kendi seçtiği hisselerin verisini alır. Bu, ağ trafiğini %90'a varan oranda azaltabilir.
Canlı Veri Akışında Hata Ayıklama ve İzleme (Monitoring)
Gerçek zamanlı sistemlerde "bağlantı koptu" veya "veri akışı durdu" gibi sorunları tespit etmek, kullanıcı deneyimi açısından kritiktir. Socket.io'nun sunduğu adapter yapısı ve middleware kullanımı ile sistemin sağlığını sürekli izleyebilirsiniz.
Özellikle üretim ortamında, bağlantı kopmalarını analiz etmek için aşağıdaki gibi bir "heartbeat" (kalp atışı) mekanizması kurmanız önerilir:
// İstemci tarafında bağlantı durumu izleme
socket.on('connect_error', (err) => {
console.error('Bağlantı hatası:', err.message);
// Kullanıcıya görsel bir uyarı göster
showNotification('Sunucu bağlantısı kesildi, tekrar deneniyor...');
});
socket.on('reconnect_attempt', (attempt) => {
console.log(`Yeniden bağlanma denemesi: ${attempt}`);
});
Performans İçin İleri İpuçları
- Veri Sıkıştırma: Socket.io varsayılan olarak veriyi sıkıştırır, ancak çok yoğun veri akışında
msgpackgibi ikili (binary) formatlar kullanarak paket boyutunu küçültebilirsiniz. - Throttling (Kısıtlama): Sunucudan istemciye saniyede 100 kez veri göndermek yerine, istemcinin render hızına uygun olarak (örneğin 200ms aralıklarla) veriyi gruplayarak (batching) gönderin.
- Memory Leak Kontrolü: İstemci tarafında
socket.off()kullanarak, bileşenler (component) kapandığında event dinleyicilerini temizlediğinizden emin olun.
Bu optimizasyonlar, uygulamanızın sadece çalışmasını değil, aynı zamanda yüksek trafik altında bile stabil kalmasını sağlayacaktır. Profesyonel bir borsa dashboard'u, veriyi sadece göstermekle kalmaz, aynı zamanda ağ kaynaklarını en verimli şekilde yönetir.
Sonuç
Node.js ve Socket.io, modern web uygulamalarında gerçek zamanlı veri akışı sağlamak için en güçlü araçlardan biridir. Bu rehberde, bir borsa takip ekranının temel mimarisini kurmayı, veriyi sunucudan istemciye aktarmayı ve bu süreci yönetmeyi öğrendiniz. Bir sonraki adım olarak, gelen verileri bir grafik kütüphanesi (örneğin Chart.js) ile görselleştirmeyi ve kullanıcıların belirli hisse senetlerine abone olabileceği "oda" (room) yapısını projenize entegre etmeyi deneyebilirsiniz.
Yazılım dünyasında bu tür sistemler, kullanıcı etkileşimini artırmak ve veriye dayalı kararlar almayı kolaylaştırmak için vazgeçilmezdir. Öğrendiğiniz bu temel yapı, daha karmaşık finansal dashboard'lar oluşturmanız için sağlam bir zemin oluşturacaktır.


Yorumlar (0)
Yorum Yaz