EMZETT.
Giriş yap

Pusher

Kısaca: Sunucu ile tarayıcı arasında gerçek zamanlı iletişim (WebSockets) için barındırılan bir hizmet; örneğin bir sohbet mesajının sayfa yeniden yüklenmeden hemen diğer tüm açık tarayıcı pencerelerinde görünmesi için.

Biraz daha ayrıntılı: Tarayıcıda bir “kanala” abone olursun; sunucu bu kanalda olaylar “yayımlar” ve Pusher bunları bağlı tüm istemcilere gerçek zamanlı iletir. Özel kanallar (örneğin kişisel sohbetler), her bağlantı denemesinde kullanıcının bu kanala hiç erişip erişemeyeceğini kontrol eden özel bir sunucu uç noktasına (auth uç noktası) ihtiyaç duyar.

Bizim bağlamımız: Emzett’te ekip içi sohbeti, açık topluluk sohbetini ve arkadaşlar arasındaki yeni doğrudan mesajları besler — üçü de aynı mevcut Pusher auth uç noktasını kullanır, ancak önünde farklı erişim kontrolleri vardır.

Ayrıntılı

Webde gerçek zamanlı iletişim temelde iki şekilde çözülebilir: polling (tarayıcı kısa aralıklarla kendisi sorar, “yeni bir şey var mı?”) ya da bir WebSocket bağlantısı (sunucu ve tarayıcı, yeni bir istek gerekmeden iki tarafın istediği zaman mesaj gönderebildiği kalıcı açık bir bağlantı tutar). Polling’i kurmak daha basittir ama gereksiz trafik ve fark edilir bir gecikme yaratır; WebSocket’ler anlıktır, ancak kendin işletmek daha fazla iş gerektirir — bağlı kullanıcı başına kalıcı açık bir soket, birçok sunucu örneğine aynı anda önemsiz biçimde ölçeklenmez. Pusher gibi hizmetler tam olarak bu ölçekleme sorununu üstlenir ve bunun yerine basit bir yayımla/abone ol API’si sunar.

Kanal kavramı üç görünürlük düzeyi bilir: herkese açık kanallar (herkes kontrol olmadan abone olabilir), özel kanallar (abone olurken sunucu tarafında bir auth kontrolü gerekir) ve presence kanalları (özel olanlar gibi, ek olarak şu anda kimin çevrimiçi olduğunun otomatik bir listesiyle — bir sohbette “çevrimiçi” göstergeleri için kullanışlı).

// Sunucu: bir kanala olay gönder
await pusher.trigger(`chat-${roomId}`, "new-message", { text, userId })
// Tarayıcı: olayı al
pusherClient.subscribe(`chat-${roomId}`).bind("new-message", (data) => { ... })

Kopan bağlantılar ve yeniden bağlanmalar

Bir WebSocket bağlantısı her an kopabilir — mobil ağ değişir, Wi-Fi kısa süre gider, dizüstü bilgisayar bekleme moduna geçer. Pusher istemcisi arka planda otomatik yeniden bağlanmayı halleder, ancak kesinti SIRASINDA gönderilen mesajlar bu istemci için kaybolur; uygulama bunları ek olarak kalıcı depolamıyor (örneğin veri tabanında) ve yeniden bağlanınca sonradan çekmiyorsa. Bir sohbet için bu şu demektir: Pusher “canlı” teslimatı sağlar, ancak asıl mesaj geçmişi yine ayrıca kalıcı hâle getirilmelidir — Pusher’ın kendisi depolama değil, yalnızca bir teslimat mekanizmasıdır.

Presence kanalları ayrıntılı

Presence kanalları, özel kanalları otomatik yönetilen katılımcı listeleriyle genişletir: bir istemci başarıyla abone olur olmaz, o anda mevcut tüm kullanıcılarla bir pusher:subscription_succeeded olayı tetiklenir; ardından pusher:member_added/pusher:member_removed katılmaları/ayrılmaları gerçek zamanlı bildirir — bunu kendi heartbeat istekleriyle yeniden kurmak zorunda kalmadan “şu anda kim çevrimiçi” göstergeleri için kullanışlıdır.

Ayrıca bak: Hız sınırlama, Soketler, Hizmet