EMZETT.
Login

Pusher

Kurz: Ein gehosteter Dienst für Echtzeit-Kommunikation (WebSockets) zwischen Server und Browser — z. B. damit eine Chat-Nachricht sofort bei allen anderen offenen Browserfenstern erscheint, ohne dass die Seite neu geladen werden muss.

Genauer: Man abonniert im Browser einen “Channel”; der Server “published” Events auf diesen Channel, Pusher leitet sie in Echtzeit an alle verbundenen Clients weiter. Private Channels (z. B. persönliche Chats) brauchen einen eigenen Server-Endpoint (Auth-Endpoint), der bei jedem Verbindungsversuch prüft, ob der User überhaupt Zugriff auf diesen Channel haben darf.

Kontext bei uns: Trägt bei Emzett den internen Team-Chat, den offenen Community-Chat und die neuen Direktnachrichten zwischen Freunden — alle drei nutzen denselben bestehenden Pusher-Auth-Endpoint, aber unterschiedliche Zugriffsprüfungen davor.

Im Detail

Echtzeit-Kommunikation im Web lässt sich grundsätzlich auf zwei Arten lösen: Polling (der Browser fragt in kurzen Abständen selbst nach, „gibt’s was Neues?“) oder eine WebSocket-Verbindung (Server und Browser halten eine dauerhaft offene Verbindung, über die beide Seiten jederzeit Nachrichten schicken können, ohne dass eine neue Anfrage nötig ist). Polling ist einfacher zu bauen, verursacht aber unnötigen Traffic und spürbare Verzögerung; WebSockets sind sofort, aber aufwendiger selbst zu betreiben — ein dauerhaft offener Socket pro verbundenem Nutzer skaliert nicht trivial auf vielen Server-Instanzen gleichzeitig. Dienste wie Pusher übernehmen genau dieses Skalierungsproblem und bieten stattdessen eine einfache Publish/Subscribe-API an.

Das Channel-Konzept kennt drei Sichtbarkeitsstufen: public Channels (jeder kann ohne Prüfung abonnieren), private Channels (brauchen eine Server-seitige Auth-Prüfung beim Abonnieren) und presence Channels (wie private, zusätzlich mit automatischer Liste, wer gerade online ist — praktisch für „online“-Anzeigen in einem Chat).

// Server: Event an einen Channel senden
await pusher.trigger(`chat-${roomId}`, "new-message", { text, userId })
 
// Browser: Event empfangen
pusherClient.subscribe(`chat-${roomId}`).bind("new-message", (data) => { ... })

Verbindungsabbrüche und Reconnects

Eine WebSocket-Verbindung kann jederzeit abbrechen — Handynetz wechselt, WLAN kurz weg, Laptop geht in Standby. Der Pusher-Client übernimmt automatisches Reconnecting im Hintergrund, aber Nachrichten, die WÄHREND der Unterbrechung gesendet wurden, gehen für diesen Client verloren, sofern die Anwendung sie nicht zusätzlich dauerhaft speichert (z. B. in der Datenbank) und beim Reconnect nachträglich abfragt. Für einen Chat bedeutet das: Pusher liefert die “Live”-Zustellung, die eigentliche Nachrichtenhistorie muss trotzdem separat persistiert werden — Pusher selbst ist kein Speicher, nur ein Zustellmechanismus.

Presence Channels im Detail

Presence Channels erweitern private Channels um automatisch verwaltete Teilnehmerlisten: Sobald ein Client erfolgreich abonniert, feuert ein pusher:subscription_succeeded-Event mit allen aktuell anwesenden Nutzern, danach informieren pusher:member_added/pusher:member_removed über Beitritte/Austritte in Echtzeit — praktisch für “wer ist gerade online”-Anzeigen, ohne das selbst über eigene Heartbeat-Requests nachbauen zu müssen.

Siehe auch: Rate Limiting, Sockets, Dienst