Server-Sent Events (SSE) Nedir?
Kısa tanım
Server-Sent Events (SSE), sunucunun açık tutulan tek bir HTTP yanıtı üzerinden tarayıcıya sürekli olay göndermesini sağlayan web standardıdır. Yanıt text/event-stream içerik türüyle gönderilir, tarayıcı tarafında EventSource arayüzüyle dinlenir. İletişim yalnızca sunucudan istemciye doğrudur; bağlantı koptuğunda tarayıcı otomatik olarak yeniden bağlanır ve son alınan olayın kimliğini bildirebilir. Bildirimler, ilerleme durumu ve canlı akışlar için WebSocket'ten daha basit bir seçenektir.
Diğer adları: SSE, EventSource, sunucu gönderimli olaylar, text/event-stream

Hiç bitmeyen bir HTTP yanıtı
SSE yeni bir protokol değildir; sıradan bir HTTP isteği ve yanıtı üzerine kuruludur. Tarayıcı bir adrese istek atar, sunucu Content-Type: text/event-stream başlığıyla yanıt vermeye başlar ama yanıtı kapatmaz. Yeni bir olay olduğunda akışa birkaç satır yazar, tarayıcı da bu satırları anında olay olarak işler. Standart, WHATWG'nin HTML spesifikasyonunun bir parçasıdır ve tarayıcıdaki karşılığı EventSource arayüzüdür.
İletişim tek yönlüdür: sunucu konuşur, istemci dinler. İstemcinin sunucuya bir şey söylemesi gerekiyorsa bunu ayrı ve sıradan HTTP istekleriyle yapar. Gerçek zamanlı ihtiyaçların önemli bir kısmı zaten bu kalıba uyar.
Akış formatı
Her olay bir veya birkaç alan: değer satırından oluşur ve boş bir satırla biter:
: bağlantıyı canlı tutmak için yorum satırı
retry: 5000
id: 41
event: siparis
data: {"no": "S-1042", "durum": "kargoda"}
id: 42
data: Rapor oluşturuluyor: %60
data: Olayın içeriği. Art arda gelendatasatırları alt satıra geçilerek birleştirilir.event: Olayın türü. Yazılmazsa olay varsayılanmessagetüründe kabul edilir.id: Olay kimliği. Tarayıcı son kimliği hatırlar.retry: Bağlantı koptuğunda kaç milisaniye sonra yeniden deneneceği.- İki nokta üst üste ile başlayan satırlar yorumdur ve yok sayılır.
Tarayıcıda dinlemek ve kopan bağlantıyı sürdürmek
const kaynak = new EventSource("/api/olaylar");
kaynak.addEventListener("siparis", (e) => guncelle(JSON.parse(e.data)));
kaynak.onmessage = (e) => ilerlemeyiGoster(e.data);SSE'nin en kullanışlı özelliği yeniden bağlanmanın tarayıcıya bırakılmasıdır. Bağlantı koptuğunda EventSource kendiliğinden yeniden bağlanır ve son aldığı kimliği Last-Event-ID başlığında gönderir. Sunucu bu bilgiyle kaçırılan olayları tekrar yollayabilir; bunun için olayları kısa bir süre saklaması gerekir.
SSE mi, WebSocket mi?
Bildirimler, uzun süren bir işin ilerleme yüzdesi, canlı skor veya log akışı gibi sunucudan istemciye tek yönlü veri gereken durumlarda SSE daha az parça gerektirir: ek protokol yok, el sıkışma yok, mevcut HTTP altyapısı, çerezler ve kimlik doğrulama olduğu gibi çalışır. Büyük dil modeli API'lerinin çoğu da üretilen metni parça parça SSE ile akıtır. İstemcinin de sık ve düşük gecikmeyle mesaj göndermesi gerekiyorsa WebSocket daha uygundur. SSE yalnızca UTF-8 metin taşır; ikili veri için uygun değildir.
Pratikte karşılaşılan tuzaklar
- Bağlantı sınırı: MDN'nin belirttiği gibi HTTP/2 kullanılmadığında tarayıcılar aynı alan adına en fazla 6 eş zamanlı bağlantı açar ve bu sınır tüm sekmeler için ortaktır. Birkaç sekmede açık SSE akışı sitenin diğer isteklerini bekletebilir.
- Tamponlama: Reverse proxy'ler ve sıkıştırma katmanları yanıtı biriktirip toplu gönderebilir; olaylar gecikmeli gelir. nginx'te bu uç nokta için tamponlamanın kapatılması gerekir.
- Zaman aşımı: Spesifikasyon, kısa sürede bağlantı kesen eski proxy'lere karşı yaklaşık 15 saniyede bir yorum satırı gönderilmesini önerir.
- Özel başlık yok:
EventSource, isteğeAuthorizationgibi özel başlık eklemeye izin vermez. Kimlik doğrulama çerezle yapılır ya da akışfetchile okunur.

