Server-Sent Events
Browser’a event akışı gönderin; backpressure ve yeniden bağlantı davranışını tasarlayın.
SSE, tek bir HTTP response üzerinden browser’a event göndermek için kullanılır. SseEvent event biçimini, SseResponse ise lazy response’u sağlar.
İlk event#
Manifestinize futures = "0.3" ekleyin. std::convert::Infallible ve facade’dan sse, SseEvent, SseResponse import edin. /files controller’ındaki action:
#[get("/events")]
async fn events(&self) -> Result<SseResponse, HttpApiError> {
let event = SseEvent::new("export-ready")?
.event("export")?
.id("1")?;
Ok(sse(futures::stream::iter([Ok::<_, Infallible>(event)])))
}curl -N http://127.0.0.1:8080/files/eventsBu örnek export adlı, 1 ID’li tek event üretip tamamlanır. Tam controller örneği diğer streaming yollarını da içerir.
Sürekli event üretimi#
sse_channel(capacity) sınırlı bir kanal oluşturur. send backpressure uygular; try_send kanal doluysa bunu döndürür. closed ile tüketicinin kapanmasını izleyebilirsiniz. Kuyruk kapasitesini sınırsız büyütmek yerine producer’ın yavaş tüketiciye nasıl davranacağını belirleyin.
Yeniden bağlantı#
RequestExt::last_event_id istemcinin cursor bilgisini okur. Geçmiş event’leri saklama ve replay etme uygulamanın sorumluluğudur. Cursor okunması tek başına kayıpsız yeniden bağlanma garantisi vermez.
Keep-alive ve deadline#
Event data, event adı, ID ve retry alanları doğrulanır. Keep-alive/heartbeat seçimi bağlantıyı canlı tutmaya yardımcı olur; request deadline’ını yenilemez. SSE de transport timeout ve shutdown kurallarına tabidir.
Kendi tokio::spawn çağrınızla açtığınız producer otomatik olarak HTTP host’un yönettiği worker olmaz. Producer kaynak sahipliğini açık kurun veya background service modeli kullanın.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.