WebSocket ve Server-Sent Events: Gerçek Zamanlı API'ler için Hangisi Daha İyi?

Ashley Innocent

Ashley Innocent

13 March 2026

WebSocket ve Server-Sent Events: Gerçek Zamanlı API'ler için Hangisi Daha İyi?

enterprise.banner.title

enterprise.banner.feature1

enterprise.banner.feature2

enterprise.banner.feature3

enterprise.banner.ctaB

TL;DR

Tek yönlü sunucudan istemciye bildirimler ve canlı akışlar gibi güncellemeler için Sunucu Tarafından Gönderilen Olayları (SSE) kullanın. Sohbet ve oyun gibi çift yönlü iletişim için WebSocket kullanın. SSE daha basittir ve HTTP üzerinden çalışır. WebSocket daha karmaşıktır ancak iki yönlü mesajlaşmayı destekler. Modern PetstoreAPI, farklı gerçek zamanlı kullanım durumları için her ikisini de uygular.

Giriş

API'nızda gerçek zamanlı güncellemelere ihtiyacınız var. Bir evcil hayvanın durumu "mevcut"tan "evlat edinildi"ye değişir; istemcilerin bunu hemen bilmesi gerekir. WebSocket mi yoksa Sunucu Tarafından Gönderilen Olaylar (SSE) mı kullanırsınız?

Çoğu geliştirici, "daha güçlü" olduğu için varsayılan olarak WebSocket'i kullanır. Ancak SSE genellikle daha iyi bir seçimdir. Daha basittir, standart HTTP üzerinden çalışır ve bağlantı kopmalarını otomatik olarak yönetir. WebSocket, ihtiyacınız olmayan bir karmaşıklık ekler.

Modern PetstoreAPI her iki protokolü de uygular. Evcil hayvan durumu güncellemeleri ve sipariş bildirimleri için SSE. Canlı açık artırma teklifleri ve gerçek zamanlı sohbet için WebSocket. Her protokol farklı kullanım durumlarına hizmet eder.

💡
Gerçek zamanlı API'lar oluşturuyor veya test ediyorsanız, Apidog hem SSE hem de WebSocket testini destekler. Olay akışlarını test edebilir, mesaj formatlarını doğrulayabilir ve yeniden bağlantı senaryolarını simüle edebilirsiniz.
button

Bu kılavuzda, SSE ve WebSocket arasındaki farkları öğrenecek, Modern PetstoreAPI'den gerçek örnekler görecek ve her protokolü ne zaman kullanacağınızı keşfedeceksiniz.

Sunucu Tarafından Gönderilen Olaylar (SSE) Nedir?

SSE, sunucudan istemciye olay akışı için HTTP tabanlı bir protokoldür.

SSE Nasıl Çalışır?

İstemci bir bağlantı açar ve olaylar gerçekleştikçe onları alır:

const eventSource = new EventSource('https://petstoreapi.com/v1/pets/notifications');

eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Pet update:', data);
};

eventSource.addEventListener('adoption', (event) => {
  const data = JSON.parse(event.data);
  console.log('Pet adopted:', data.petId);
});

Sunucu olayları gönderir:

GET /v1/pets/notifications
Accept: text/event-stream

HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache

event: adoption
data: {"petId":"019b4132","userId":"user-456"}

event: status-change
data: {"petId":"019b4127","status":"AVAILABLE"}

SSE Özellikleri

1. Tek yönlü iletişim

Sunucu istemciye gönderir. İstemci, SSE bağlantısı üzerinden geri mesaj gönderemez (ancak normal HTTP isteklerini kullanabilir).

2. HTTP Üzerine Kurulmuştur

Standart HTTP kullanır. Proxy'ler, güvenlik duvarları ve CDN'ler üzerinden çalışır.

3. Otomatik yeniden bağlantı

Bağlantı koparsa, tarayıcı otomatik olarak yeniden bağlanır.

4. Yeniden Başlatma için Olay Kimlikleri

Sunucu olay kimlikleri gönderebilir. İstemci, son alınan olaydan devam eder:

id: 123
event: adoption
data: {"petId":"019b4132"}

id: 124
event: status-change
data: {"petId":"019b4127"}

Bağlantı kesilirse, istemci devam etmek için Last-Event-ID: 124 başlığını gönderir.

5. Basit protokol

Metin tabanlı format. curl ile hata ayıklaması kolaydır:

curl -N -H "Accept: text/event-stream" \
  https://petstoreapi.com/v1/pets/notifications

SSE Sınırlamaları

1. Yalnızca tek yönlü

İstemci, SSE aracılığıyla mesaj gönderemez. İstemciden sunucuya iletişim için ayrı HTTP istekleri gerekir.

2. Yalnızca metin

SSE metin gönderir. İkili veriler base64 ile kodlanmalıdır.

3. Tarayıcı bağlantı limitleri

Tarayıcılar etki alanı başına SSE bağlantılarını sınırlar (genellikle 6). Çoğu uygulama için sorun teşkil etmez.

4. Dahili sıkıştırma yok

HTTP sıkıştırması çalışır, ancak WebSocket gibi protokol düzeyinde sıkıştırma yoktur.

WebSocket Nedir?

WebSocket, kalıcı bir bağlantı üzerinden tam çift yönlü, çift yönlü bir protokoldür.

WebSocket Nasıl Çalışır?

İstemci ve sunucu her zaman mesaj gönderebilir:

const ws = new WebSocket('wss://petstoreapi.com/auctions/019b4132');

// Send message to server
ws.send(JSON.stringify({
  type: 'bid',
  amount: 500
}));

// Receive messages from server
ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Auction update:', data);
};

ws.onclose = () => {
  console.log('Connection closed');
  // Manual reconnection logic needed
};

Sunucu her zaman gönderebilir:

{"type":"bid","userId":"user-456","amount":550}
{"type":"outbid","newAmount":550}

İstemci her zaman gönderebilir:

{"type":"bid","amount":600}
{"type":"watch","petId":"019b4132"}

WebSocket Özellikleri

1. Çift yönlü

Hem istemci hem de sunucu her zaman mesaj gönderebilir. Gerçek iki yönlü iletişim.

2. Düşük gecikme süresi

Kalıcı bağlantı. Mesaj başına HTTP yükü yok. Oyun, sohbet, canlı işbirliği için idealdir.

3. İkili veri desteği

İkili verileri doğrudan gönderebilir. Base64 kodlamasına gerek yoktur.

4. Özel protokol

ws:// veya wss:// (güvenli) kullanır. İlk el sıkışmadan sonra HTTP değildir.

5. Çerçeve tabanlı

Mesajlar çerçevelenir. Kısmi mesajlar gönderilebilir ve yeniden birleştirilebilir.

WebSocket Sınırlamaları

1. Karmaşık kurulum

WebSocket sunucusu gerektirir. HTTP uç noktalarından daha karmaşıktır.

2. Manuel yeniden bağlantı

Otomatik yeniden bağlantı yok. Yeniden deneme mantığını uygulamanız gerekir.

3. Proxy sorunları

Bazı kurumsal proxy'ler WebSocket'i engeller. HTTP proxy'leri ws://'yi anlamaz.

4. Durum bilgisi olan (Stateful)

Sunucu bağlantıları izlemelidir. Durum bilgisi olmayan HTTP'ye göre ölçeklendirmesi daha zordur.

5. HTTP özellikleri yok

El sıkışmadan sonra HTTP önbelleğe alma, durum kodları veya standart başlıklar kullanılamaz.

Yan Yana Karşılaştırma

Özellik SSE WebSocket
Yön Sunucu → İstemci Çift Yönlü
Protokol HTTP Özel (ws://)
Yeniden Bağlantı Otomatik Manuel
Tarayıcı Desteği Tüm modern Tüm modern
Proxy Dostu Evet Bazen
Karmaşıklık Basit Karmaşık
İkili Veri Hayır (yalnızca metin) Evet
Gecikme Süresi Düşük Çok düşük
Ölçeklenebilirlik Yüksek (durumsuz) Orta (durum bilgisi olan)
Kullanım Durumu Bildirimler, akışlar Sohbet, oyun, işbirliği

Modern PetstoreAPI Her İkisini Nasıl Kullanır?

Modern PetstoreAPI, farklı senaryolar için hem SSE hem de WebSocket'i uygular.

Evcil Hayvan Güncellemeleri için SSE

Uç nokta: GET /v1/pets/notifications

const events = new EventSource(
  'https://petstoreapi.com/v1/pets/notifications?userId=user-456'
);

events.addEventListener('adoption', (e) => {
  const data = JSON.parse(e.data);
  showNotification(`${data.petName} was adopted!`);
});

events.addEventListener('status-change', (e) => {
  const data = JSON.parse(e.data);
  updatePetStatus(data.petId, data.status);
});

Sunucu uygulaması:

app.get('/v1/pets/notifications', (req, res) => {
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');

  const userId = req.query.userId;

  // Subscribe to pet updates
  const subscription = petUpdates.subscribe(userId, (event) => {
    res.write(`event: ${event.type}\n`);
    res.write(`data: ${JSON.stringify(event.data)}\n\n`);
  });

  req.on('close', () => {
    subscription.unsubscribe();
  });
});

Kullanım durumları:

Canlı Açık Artırmalar için WebSocket

Uç nokta: wss://petstoreapi.com/auctions/{auctionId}

const ws = new WebSocket('wss://petstoreapi.com/auctions/019b4132');

// Place bid
function placeBid(amount) {
  ws.send(JSON.stringify({
    type: 'bid',
    amount
  }));
}

// Receive updates
ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  switch (msg.type) {
    case 'bid':
      updateCurrentBid(msg.amount, msg.userId);
      break;
    case 'outbid':
      showOutbidNotification(msg.newAmount);
      break;
    case 'auction-end':
      showAuctionResult(msg.winner);
      break;
  }
};

Sunucu uygulaması:

wss.on('connection', (ws, req) => {
  const auctionId = req.params.auctionId;
  const auction = auctions.get(auctionId);

  ws.on('message', (data) => {
    const msg = JSON.parse(data);

    if (msg.type === 'bid') {
      const result = auction.placeBid(msg.userId, msg.amount);

      // Broadcast to all participants
      auction.participants.forEach(participant => {
        participant.send(JSON.stringify({
          type: 'bid',
          userId: msg.userId,
          amount: msg.amount
        }));
      });
    }
  });
});

Kullanım durumları:

Apidog ile Gerçek Zamanlı API'ları Test Etme

Apidog hem SSE hem de WebSocket API'lerini test etmeyi destekler.

SSE Testi

1. SSE isteği oluşturun:

GET https://petstoreapi.com/v1/pets/notifications
Accept: text/event-stream

2. Olayları doğrulayın:

3. Senaryoları test edin:

WebSocket Testi

1. WebSocket bağlantısı oluşturun:

wss://petstoreapi.com/auctions/019b4132

2. Test mesajları gönderin:

{"type":"bid","amount":500}
{"type":"watch","petId":"019b4132"}

3. Yanıtları doğrulayın:

4. Senaryoları test edin:

Her Birini Ne Zaman Kullanmalı

SSE'yi Şu Durumlarda Kullanın:

Örnekler:

WebSocket'i Şu Durumlarda Kullanın:

Örnekler:

Sadece Şunlar Yüzünden WebSocket Kullanmayın:

❌ "Daha gelişmiş" - Fayda sağlamayan karmaşıklık

❌ "Herkes kullanıyor" - SSE genellikle daha basittir

❌ "Daha hızlı" - SSE çoğu kullanım durumu için yeterince hızlıdır

❌ "Çift yönlü" - Gerçekten çift yönlüye ihtiyacınız var mı?

Sonuç

SSE ve WebSocket'in her ikisi de gerçek zamanlı iletişimi mümkün kılar, ancak farklı senaryolar için tasarlanmışlardır. SSE, otomatik yeniden bağlantı ve HTTP uyumluluğu ile tek yönlü sunucudan istemciye güncellemelerde üstündür. WebSocket, çift yönlü, düşük gecikmeli iletişimde öne çıkar.

Modern PetstoreAPI, her iki protokolü de nasıl etkili bir şekilde kullanacağınızı gösterir. Bildirimler ve durum güncellemeleri için SSE. Canlı açık artırmalar ve sohbet için WebSocket. "Daha iyi" görünen protokole göre değil, kullanım durumunuza göre seçin.

Hem SSE hem de WebSocket uygulamalarının farklı senaryolarda doğru çalıştığından emin olmak için gerçek zamanlı API'larınızı Apidog ile test edin.

Sıkça Sorulan Sorular

SSE kurumsal güvenlik duvarları üzerinden çalışabilir mi?

Evet. SSE standart HTTP kullanır, bu nedenle HTTP proxy'leri ve güvenlik duvarları üzerinden çalışır. WebSocket ise bazı proxy'lerin engellediği özel bir protokol kullanır.

WebSocket SSE'den daha mı hızlıdır?

WebSocket'in biraz daha düşük gecikme süresi vardır (mesaj başına HTTP yükü yoktur), ancak çoğu uygulama için fark göz ardı edilebilir. SSE bildirimler, akışlar ve durum güncellemeleri için yeterince hızlıdır.

SSE yeniden bağlantısını nasıl yönetirsiniz?

Tarayıcı yeniden bağlantıyı otomatik olarak yönetir. Sunucudan olay kimlikleri gönderin, istemci `Last-Event-ID` başlığını kullanarak son alınan olaydan devam edecektir.

SSE'yi mobil uygulamalarla kullanabilir misiniz?

Evet. iOS ve Android, yerel HTTP istemcileri veya kütüphaneleri aracılığıyla SSE'yi destekler. SSE, HTTP'nin çalıştığı her yerde çalışır.

Maksimum SSE bağlantı süresi nedir?

Kesin bir sınır yoktur. SSE bağlantıları süresiz açık kalabilir. Bazı proxy'ler veya yük dengeleyiciler zaman aşımlarına sahip olabilir (genellikle 30-60 saniye), ancak tarayıcı otomatik olarak yeniden bağlanacaktır.

WebSocket ikili veri gönderebilir mi?

Evet. WebSocket hem metin hem de ikili çerçeveleri destekler. Base64 kodlamasına gerek kalmadan resim, ses veya herhangi bir ikili veri gönderebilirsiniz.

Bir tarayıcı kaç SSE bağlantısına sahip olabilir?

Tarayıcılar, etki alanı başına SSE bağlantılarını sınırlar (genellikle 6). Bu nadiren bir sorundur; çoğu uygulama yalnızca 1-2 SSE bağlantısına ihtiyaç duyar.

SSE için özel bir sunucuya ihtiyacınız var mı?

Hayır. Herhangi bir HTTP sunucusu SSE'yi işleyebilir. Sadece doğru başlıkları (Content-Type: text/event-stream) ayarlayın ve bağlantıyı açık tutun.

API Tasarım-Öncelikli Yaklaşımı Apidog'da Uygulayın

API'leri oluşturmanın ve kullanmanın daha kolay yolunu keşfedin