lilydocs
HTTP APIWebSocketConsumer
Yayın2 dk okuma

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#

Action içinde yayın parçası
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:

Receipt parçası
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:

Akış
targeted = sent + backpressured + closed + missing

sent, 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.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod