Server-Sent Events
- Okunuşu
- sörvır sent ivents
Kısaca
Server-Sent Events, sunucunun tarayıcıya tek bir uzun ömürlü HTTP bağlantısı üzerinden sürekli metin güncellemeleri göndermesini sağlayan web standardıdır.
Server-Sent Events nedir?
Server-Sent Events ya da SSE, bir web sayfasına sunucudan gelen tek yönlü bir kanal sağlar: tarayıcı bağlantıyı bir kez açar, sunucu onu açık tutar ve bildirecek bir şeyi olduğunda yeni bir mesaj gönderir. SSE, tarayıcılara EventSource API'siyle yerleşik olarak gelir ve sıradan HTTP üzerinde çalışır; bu yüzden özel bir kurulum gerekmeden çoğu proxy'den, load balancer'dan ve güvenlik duvarından geçer.
Sunucu text/event-stream içerik tipiyle yanıt verir ve mesajları basit bir metin biçiminde yazar: data: ile başlayan satırlar, adlandırılmış bir olay tipi için isteğe bağlı event: ve mesaj kimliği için id:; her mesajı boş bir satır bitirir. Bağlantı koparsa tarayıcı otomatik olarak yeniden bağlanır ve Last-Event-ID başlığını gönderir; böylece sunucu kaldığı yerden devam edebilir. HTTP/1.1 üzerinde tarayıcılar site başına yalnızca yaklaşık altı açık bağlantıya izin verir; bu, çok sayıda sekmede sorun olabilir, ancak HTTP/2 ve HTTP/3 üzerinde birçok akış tek bir bağlantıyı paylaşır.
SSE, canlı bir haber bandına abone olmak gibidir: bir kez abone olursunuz ve başlıklar gelmeye devam eder, ancak aynı kanaldan karşılık veremezsiniz. Bildirimler, canlı panolar, hisse fiyatları, derleme ve dağıtım logları, ilerleme çubukları ve metnin model ürettikçe kelime kelime göründüğü LLM yanıt akışları için doğal bir uyumdur. İstemcinin veri göndermesi gerektiğinde akışın yanında sıradan HTTP istekleri kullanır.
SSE sıklıkla WebSocket ve long polling ile karşılaştırılır. WebSocket, her iki tarafın istediği zaman mesaj gönderebildiği ayrı, iki yönlü bir protokoldür; sohbet, çok oyunculu oyunlar ve ortak düzenleme için uygundur ancak daha fazla altyapı desteği gerektirir. Long polling, sunucunun veri gelene kadar açık tuttuğu tekrarlanan isteklerle push'u taklit eder ve istemcinin her yanıttan sonra yeniden bağlanması gerekir. SSE bu ikisinin arasında durur: tek yönlü sunucu push'u, yalnızca metin, düz HTTP üzerinde otomatik yeniden bağlanma. Bir sınırlama, yerel EventSource'un Authorization gibi özel başlıklar gönderememesidir; bu yüzden uygulamalar cookie'lere dayanır ya da fetch() tabanlı bir SSE istemcisi kullanır.
Önemli noktalar
- SSE, mesajları sunucudan tarayıcıya tek bir uzun ömürlü HTTP yanıtı üzerinden akıtır.
- Sunucu
text/event-streamverisi gönderir, tarayıcılar onuEventSourceAPI'siyle okur. - Tarayıcılar otomatik yeniden bağlanır ve
Last-Event-IDbaşlığını kullanarak devam eder. - SSE tek yönlü ve yalnızca metindir; her iki taraf da mesaj göndermek zorundaysa WebSocket kullanın.
- Bildirimler, canlı panolar ve LLM çıktısı akışı için yaygın olarak kullanılır.
Örnek
// Server (Node.js): keep the response open and write events
import http from "node:http";
http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/event-stream", "Cache-Control": "no-cache" });
const timer = setInterval(() => {
res.write("data: " + JSON.stringify({ time: Date.now() }) + "\n\n");
}, 1000);
req.on("close", () => clearInterval(timer));
}).listen(3000);
// Browser: subscribe and react to each message
const source = new EventSource("/events");
source.onmessage = (event) => console.log(JSON.parse(event.data).time);Sık sorulan sorular
SSE, WebSocket'ten daha mı iyidir?
Hiçbiri genel olarak daha iyi değildir. SSE daha basittir ve otomatik yeniden bağlanmayla düz HTTP üzerinde çalışır; bu da yalnızca sunucunun veri göndermesi gerektiğinde onu ideal yapar. Sohbet veya oyunlarda olduğu gibi her iki taraf da sık mesaj gönderiyorsa WebSocket daha iyi seçimdir.
LLM API'leri neden Server-Sent Events kullanır?
Üretilen metni parça parça akıtırlar; böylece kullanıcılar tüm yanıtı beklemek yerine cevabın hemen belirdiğini görür. SSE bu tek yönlü akışa iyi uyar ve sıradan HTTP altyapısıyla çalışır.
SSE, HTTP/2 ile çalışır mı?
Evet, hatta orada daha iyi çalışır. HTTP/2 birçok akışı tek bir bağlantı üzerinden çoklar; bu da HTTP/1.1'deki site başına yaklaşık altı bağlantı sınırını kaldırır, ki bu sınır birçok sekmede SSE'yi engelleyebilirdi.
Sık karşılaştırılanlar
İlgili sayfalar
- WebSocketWeb Geliştirme, s. 61WebSocket, tarayıcı ile sunucu arasında tek bir bağlantıyı açık tutarak her iki tarafın istediği an birbirine anında mesaj göndermesini sağlayan protokoldür.
- Long PollingBackend ve API'ler, s. 27Long polling, istemcinin gönderdiği isteği sunucunun yeni veri hazır olana kadar açık tuttuğu, düz HTTP üzerinden gerçek zamanlı push'u taklit eden tekniktir.
- HTTPWeb Geliştirme, s. 20HTTP, tarayıcıların, uygulamaların ve sunucuların basit bir istek-yanıt döngüsüyle web sayfaları ve veri alışverişi yapmasını sağlayan protokoldür.
- Pub/SubBackend ve API'ler, s. 35Pub/sub, yayıncıların konulara mesaj gönderdiği ve bir konunun her abonesinin, iki taraf da birbirini tanımadan bir kopya aldığı bir mesajlaşma kalıbıdır.
- Event StreamingBackend ve API'ler, s. 13Event streaming, olayları birçok uygulamanın gerçek zamanlı okuyup yeniden oynatabildiği ve işleyebildiği sürekli, sıralı, kalıcı bir log olarak kaydetmektir.
- LLMYapay Zekâ ve Makine Öğrenmesi, s. 28LLM, çok büyük metin yığınlarıyla eğitilmiş ve bir sonraki en olası metin parçasını tekrar tekrar tahmin ederek dil üreten bir makine öğrenmesi modelidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin