Client hedefleri ve sonuçlar
Namespace içindeki alıcıları seçin, yayın yapın ve kısmi kuyruk kabulü sonuçlarını ele alın.
context.clients() mevcut server bağlantılarına yayın aracıdır. Başka bir sunucuya yeni bağlantı açmak için WebSocket client kullanılır. Bütün client target seçimleri controller namespace'i içinde kalır.
Alıcı seçimi#
| Seçim | Alıcılar |
|---|---|
caller() |
Çağıran bağlantı |
others() |
Aynı namespace'te caller dışındakiler |
all() |
Aynı namespace'teki bağlantılar |
client(id) / clients(ids) |
Açıkça seçilmiş bağlantılar |
room(name) / rooms(names) |
Oda veya oda birleşimi |
principal(id) |
Doğrulanmış kimliğin aktif cihazları |
.except(ids) |
Seçimden çıkarılacak bağlantılar |
Oda birleşiminde alıcılar deduplicate edilir. Başka namespace'teki explicit connection ID bu sınırı aşmaz; local raporda missing sayılır. Boş explicit seçim, mesaj doğrulamasından sonra başarılı no-op olabilir.
Gönderim#
context.clients().others()
.send("chat:received", input)
.await
.map_err(WebSocketActionError::internal)?;Bu parçayı chat namespace'inde, serializable input alan bir action içinde kullanın. Odalar sayfası import ve DTO'larıyla tam controller sunar. Emit outcome'u yalnızca caller'a gider; broadcast için bu explicit hedef yolu gerekir.
Receipt okuyun#
send_with_receipt veya send_binary_with_receipt kısmi kabulü görünür kılar:
let receipt = context.clients().all()
.send_with_receipt("chat:received", input).await?;
let local = receipt.local();
let accepted_by_all_local_targets = local.is_fully_delivered();Parçanın caller hata tipi ConnectionError'ı taşımalı veya kendi hata tipine çevirmelidir. receipt.local() içindeki sonuçlar şu eşitliği sağlar:
targeted = sent + backpressured + closed + missingsent, yerel outbound kuyruğunun kabulüdür. is_fully_delivered() implementation'ı targeted == sent kontrol eder; adına bakarak peer delivery sonucu çıkarmayın. Backplane receipt'i ayrı publish kabulünü gösterir; uzak alıcı sayısı veya ACK toplamı sağlamaz.
Kısmi sonuçları ele alın#
Kolay .send() bütün gerekli acceptance koşulları sağlanmazsa hata verir. PartialBroadcast, Backpressure, BackplaneUnavailable { local } ve BackplanePublish { local, source } daha önce oluşmuş local etkileri içerebilir. DispatchInterrupted sırasında kısmi local etki olabilir ama tamamlanmış rapor yoktur; backplane publish henüz başlamamıştır.
Bu sonuçları kör retry ile tekrar göndermeyin; aynı alıcı iki kez görebilir. İdempotency veya uygulama ACK modeli gerekiyorsa ayrı kurun. clients().count() yalnızca bu node'daki namespace'i, app.active_connection_count() bütün app'in yerel bağlantılarını sayar; closing bağlantılar registry'den çıkana kadar sayılır.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.