23. Nov. 2025·6 Min. Lesezeit

WebSocket-Trennschleifen: Echtzeit-Funktionen nach dem Launch reparieren

WebSocket-Abbruchschleifen können Echtzeit-Apps nach dem Launch zerstören. Lernen Sie, Auth, Timeouts und Skalierung zu debuggen und sichere Fallbacks hinzuzufügen.

WebSocket-Trennschleifen: Echtzeit-Funktionen nach dem Launch reparieren

Warum Echtzeit-Funktionen nach dem Launch ausfallen

„Echtzeit“ bedeutet meist, dass der Bildschirm ohne Reload aktualisiert wird. Chatnachrichten erscheinen sofort, Presence zeigt, wer online ist, Dashboards aktualisieren sich und Alerts melden Änderungen in dem Moment, in dem sie passieren.

Solche Funktionen können in einer Demo perfekt aussehen und nach dem Launch auseinanderfallen, weil Produktion anders läuft. Mehr Nutzer bedeutet mehr gleichzeitige Verbindungen. Ein Proxy oder Load-Balancer sitzt zwischen dem Browser und Ihrem Server. Tokens laufen ab. Telefone wechseln das Netzwerk, gehen in den Schlafmodus und kommen wieder hoch. Jeder dieser Fälle kann eine stabile Verbindung in eine Schleife aus Abbrüchen und Wiederverbindungen verwandeln.

Für Nutzer fühlt sich eine WebSocket-Disconnect-Schleife so an: „Es funktioniert eine Sekunde, dann ist es kaputt.“ Nachrichten kommen verspätet oder gar nicht an. Die UI blinkt wiederholt „wiederverbinden…“. Presence flackert. Dashboards frieren ein und springen dann. Manchmal gibt es Duplikate, weil der Client nach dem Reconnect erneut sendet.

Was sich nach dem Launch ändert

Ein paar vorhersehbare Verschiebungen bringen Sockets an ihre Grenzen: mehr gleichzeitige Verbindungen als lokal getestet, Proxies, die „idle“-Verbindungen timen, WebSocket-Auth, die bei Refresh oder Token-Rotation scheitert, mobile Netzwerkausfälle, die aggressive Reconnects triggern, und mehrere Serverinstanzen ohne geteilten Zustand (oder ohne Sticky Sessions, wenn Sie sich auf In-Memory-Zustand verlassen).

Socket-Zuverlässigkeit heißt nicht „nie trennen“. Trennungen werden passieren. Zuverlässigkeit bedeutet, dass die App schnell und sicher wiederherstellt und keine wichtigen Ereignisse verliert. Ein fehlender Tipp-Indikator ist okay. Fehlende „Nachricht gesendet“-Bestätigungen, Bestellstatus oder Zahlungszustände sind es nicht.

Muster erkennen, bevor Sie irgendetwas ändern

Wenn Echtzeit nach dem Launch ausfällt, ist der schnellste Weg, Zeit zu verschwenden, blind am Code rumzudoktern. Beschreiben Sie die Schleife so klar, dass Sie den nächsten Abbruch vorhersagen können.

Nennen Sie das Symptom, das Sie wirklich sehen. „Es ist instabil“ verbirgt Hinweise. „Reconnects alle 6 Sekunden und doppelte Benachrichtigungen“ ist etwas, das Sie nachverfolgen können.

Bevor Sie Einstellungen anfassen, beantworten Sie ein paar Fragen:

  • Welche Clients sind betroffen (Web, iOS, Android, nur ein Browser)?
  • Welche Umgebung (lokal, Staging, nur Produktion)?
  • Trifft es alle oder nur bestimmte Accounts?
  • Tritt es zu Stoßzeiten oder direkt nach Deploys auf?

Erfassen Sie dann Beweise, während es passiert. Ein kurzer Snapshot schlägt stundenlanges Raten. Mindestens sollten Sie Zeitstempel (Client und Server), eine Nutzer- oder Sitzungs-ID, eine pro Socket generierte Verbindungs-ID, Close-Code und -Grund (falls vorhanden) und die letzten Ereignisse vor dem Abbruch (connect, auth, subscribe, ping/pong) sammeln.

Um Server-seitige Schließungen von Client-seitigen Drops zu trennen, vergleichen Sie Timelines. Wenn der Client Code 1006 zeigt und der Server keinen sauberen Close protokolliert, verdächtigen Sie Netzwerk, Proxy-Timeouts oder dass die App eingeschlafen ist. Wenn der Server direkt nach „auth“ oder „subscribe“ schließt, liegt der Verdacht bei Ihrer Logik (stales Token, fehlende Berechtigungen, geworfene Ausnahmen).

Ein praktischer Trick: Reproduzieren Sie erst mit einem Nutzer in einem Tab. Wenn das nicht geht, ist der Auslöser möglicherweise Last-bezogen.

Schritt-für-Schritt: eine Disconnect-Schleife debuggen

Wenn Sie eine Disconnect-Schleife sehen, widerstehen Sie dem Drang, zuerst Timeouts zu ändern. Machen Sie die Schleife sichtbar: Was passierte direkt bevor der Socket abbrach und wer plant den Reconnect?

Beginnen Sie mit einfachen Logs rund um den Socket-Lifecycle. Sie wollen eine saubere Geschichte von Anfang bis Ende: connect, auth, subscription, Nachrichtenfluss und dann den Close-Grund. Fügen Sie Zeitstempel und eine kurze Verbindungs-ID hinzu, damit mehrere Tabs nicht verschwimmen.

Protokollieren Sie die Basics in Reihenfolge: connect gestartet/open, auth gesendet und Erfolg/Fehler, subscribe gesendet und ack, close/error (Code und Grund) und geplanten reconnect (und durch wen).

Reproduzieren Sie dann mit dem kleinsten Setup: ein Nutzer, ein Tab, keine Hintergrundjobs. Sobald es zuverlässig fehlschlägt, fügen Sie Schritt für Schritt Komplexität hinzu (zweiter Tab, zweiter Nutzer, höheres Nachrichtenvolumen). So erfahren Sie, ob der Auslöser Last, Gleichzeitigkeit oder ein bestimmtes Abo ist.

Untersuchen Sie als Nächstes Close-Codes und Fehler. Policy-artige Schließungen deuten oft auf Auth- oder Origin-Regeln hin. Timeouts weisen auf Heartbeats, Proxies oder einen blockierten Server hin. Abnormale Schließungen bedeuten häufig, dass etwas abgestürzt ist oder das Netzwerk ohne sauberen Close verschwunden ist.

Prüfen Sie auch, ob zwei Reconnect-Mechanismen gleichzeitig aktiv sind: Ihr Code plus die Default-Logik der Socket-Bibliothek. Das kann Reconnect-Stürme erzeugen, selbst wenn das Grundproblem klein ist.

Testen Sie schließlich von einem anderen Netzwerk (Mobile-Hotspot vs. Büro-WLAN). Wenn es nur in einem Netz passiert, konzentrieren Sie sich auf Proxies, VPNs, Captive Portals oder aggressive Idle-Timeouts.

Auth bei Sockets: wo es meist schiefgeht

Viele „Netzwerk“-Bugs sind tatsächlich Auth-Bugs. Die App lädt, API-Calls funktionieren, dann bleibt das Live-Feature in einer Reconnect-Schleife hängen.

Drei gängige Auth-Setups

Die meisten Apps authentifizieren Sockets auf eine von drei Arten: Wiederverwendung einer Cookie-Session, Senden eines Bearer-Tokens während der Verbindung oder erstmaliges Abrufen eines kurzlebigen einmaligen „Socket-Tokens“ über HTTPS. Alle funktionieren, aber jede hat eine typische Fehlerquelle.

Ein klassisches Missverhältnis: Normale HTTP-Requests sind authentifiziert, der WebSocket-Handshake aber nicht. Cookies werden an Ihre API gesendet, aber für den Socket blockiert wegen Cross-Origin-Regeln. Oder der Server erwartet einen Authorization-Header, aber die Client-Bibliothek kann das Token nur als Query-Parameter oder Subprotocol übergeben.

Häufige Post-Launch-Fälle:

  • Cookies werden nicht mitgesendet wegen SameSite-, Secure- oder Domain-Einstellungen (läuft lokal, bricht in der echten Domain).
  • Der Socket verbindet sich, bevor die Session bereit ist.
  • Der Socket hält ein veraltetes Access-Token nach Refresh und wird immer wieder gekickt.
  • Der Server schließt mit „unauthorized“ und der Client verbindet sofort wieder — das erzeugt lauten Spam.

Mit unautorisierten Schließungen umgehen, ohne endlos zu reconnecten

Behandeln Sie Auth-Fehler anders als flaky Netzwerkfehler. Wenn der Server mit einem auth-bezogenen Code oder einer Nachricht schließt, stoppen Sie die Reconnect-Schleife und stellen Sie zuerst die Session wieder her. Refreshen Sie das Token (oder fordern Sie Login an) und öffnen Sie dann einen neuen Socket mit den aktuellen Zugangsdaten.

Wenn Sie unbedingt erneut versuchen müssen, nutzen Sie Backoff (1s, 2s, 5s, 10s) und fügen Sie Jitter hinzu, damit nicht viele Clients gleichzeitig reconnecten.

Ein typisches Szenario: Ein Dashboard läuft eine Stunde, das Token refreshed automatisch, aber der Socket sendet weiter das alte Token und wird alle paar Sekunden geschlossen. Die Lösung ist nicht „mehr Retries“, sondern den Socket neu zu starten, wenn sich das Token ändert.

Heartbeats, Timeouts und Reconnect-Verhalten

Prevent duplicate messages
Reduce duplicates and missing events with resume IDs and idempotent handlers.

Viele Disconnect-Schleifen lassen sich darauf zurückführen: Die Verbindung sitzt idle und etwas in der Mitte tötet sie. Dieses „Etwas“ kann Ihr Server sein, ein Proxy/Load-Balancer, ein CDN, Hotel-WLAN oder ein Telefon, das Hintergrundaktivität aussetzt.

Die übliche Lösung ist ein Heartbeat plus vernünftiges Reconnect-Verhalten. Heartbeats können ping/pong sein (am besten, wenn Ihre Bibliothek das unterstützt) oder eine kleine App-Level-Keepalive-Nachricht. Wichtig ist genug Traffic, damit Zwischenstellen die Verbindung nicht als idle markieren.

Seien Sie vorsichtig mit den Intervallen. Viele Proxies trennen idle Verbindungen nach 30–60 Sekunden. Ein gängiger Startpunkt ist ein Heartbeat alle 15–25 Sekunden und ein Client-Timeout nach 2–3 verpassten Heartbeats. Zu aggressiv verbraucht Akku/Daten auf Mobilgeräten. Zu langsam stirbt die Verbindung still.

Reconnect-Logik ist die andere Hälfte. Sofortiges Wiederverbinden kann einen Sturm auslösen, besonders nach einem Deploy oder kurzem Ausfall. Verwenden Sie jittered exponentiellen Backoff mit einer Obergrenze, setzen Sie Backoff nur zurück, wenn die Verbindung für ein kurzes Fenster stabil blieb, und machen Sie Reconnect idempotent: re-auth und resubscribe, aber keine doppelten Subscriptions.

Halb-offene Verbindungen sind tückisch: Der Client denkt, er ist verbunden, der Server ist weg. Heartbeat-Timeouts helfen, das schnell zu erkennen.

Proxies und Load-Balancer: versteckte Ursachen für Disconnects

Wenn Echtzeit lokal funktioniert, aber in Produktion flackert, prüfen Sie den Netzwerkpfad bevor Sie den Socket-Code umschreiben. Reverse-Proxies, CDNs und Load-Balancer können Verbindungen schließen, Instanzen rotieren oder Header fallen lassen.

Was Proxies mit WebSockets anstellen

Ein WebSocket startet als HTTP-Request und upgraded dann. Alles vor Ihrer App muss dieses Upgrade unterstützen und die Verbindung offenhalten. Viele Setups erzwingen außerdem Idle-Timeouts oder eine maximale Verbindungsdauer. Wenn Ihre App nur bei User-Aktionen Daten sendet, kann die Verbindung als idle aussehen und getrennt werden.

Sticky Sessions sind eine weitere Falle. Wenn Sie wichtigen Zustand im Speicher halten (Subscriptions, Room-Membership, User-Context) und der Load-Balancer eine Reconnect auf eine andere Instanz schickt, „connectet“ der User zwar, verpasst aber Events oder schlägt bei Zustandsprüfungen fehl. Geteilter Zustand (Redis, Datenbank, Message-Broker) reduziert die Notwendigkeit für Stickiness.

TLS-Termination und Überraschungen bei Auth-Headern

Wenn TLS am Proxy terminiert wird, sieht Ihre App die Anfrage möglicherweise als HTTP, sofern Forwarded-Header nicht korrekt gesetzt sind. Das kann Checks wie „nur sichere Cookies erlauben“ oder strikte Origin-Regeln brechen. Manche Proxies strippen oder benennen Header um, was Token-basierte Auth bricht.

Um zu bestätigen, was die Verbindung schließt, vergleichen Sie Close-Codes auf beiden Seiten, suchen Sie in Proxy-Logs nach Meldungen wie „upstream timeout“ oder „idle timeout“, erhöhen Sie testweise Idle-Timeouts, um zu sehen, ob das Problem aufhört, und vergewissern Sie sich, dass Upgrade- und Forwarded-Header die App erreichen.

Echtzeit skalieren, ohne Events zu verlieren

Echtzeit funktioniert in Staging oft, weil nur ein Server läuft. Nach dem Launch taucht eine zweite Instanz auf (oder die Plattform verschiebt Traffic) und Nachrichten gehen verloren. Broadcasts erreichen nur Nutzer auf derselben Maschine. Rooms und Presence werden inkonsistent. Reconnects landen auf Servern, die den Client-Zustand nicht kennen.

Die erste Regel: Bewahren Sie wichtigen Socket-Zustand nicht nur im Speicher. Das gilt für Subscription-Zustand, Nutzer-zu-Socket-Mappings, Presence und die zuletzt empfangene Event-ID. In-Memory-Zustand verschwindet bei Deploys und unterscheidet sich pro Server.

Die gängigen Muster sind: Shared Pub/Sub, sodass jeder Server publishen kann und alle Server liefern; ein dedizierter Echtzeit-Service, der Verbindungen besitzt, während API-Server stateless bleiben; oder eine Queue für nicht verlierbare Events, damit sie sicher retried werden können.

Reconnects sind der Ort, wo Duplikate reinschleichen. Nutzen Sie eine Event-ID (oder Sequenznummer) pro Kanal und lassen Sie den Client „last received“ senden. Serverseitig sollten Handler idempotent sein, damit das gleiche Event zweimal verarbeiten keine doppelten Aktionen verursacht.

Deploys brauchen auch einen Plan. Wenn Sie Server ohne Vorwarnung neu starten, erzwingen Sie Massenreconnects und Race-Conditions. Fügen Sie einen Drain-Schritt hinzu: Keine neuen Verbindungen mehr auf der alten Instanz annehmen, bestehende zu Ende laufen lassen, dann terminieren.

Fallbacks, die die App benutzbar halten

Stop reconnect storms
We’ll repair auth, heartbeats, and reconnect logic so real-time holds up after launch.

Echtzeit ist großartig, bis es nicht mehr funktioniert. Wenn Nutzer auf Disconnect-Schleifen stoßen, wollen Sie zwei Dinge: stabile Sockets und eine App, die auch ohne stabile Sockets weiterarbeitet.

WebSockets sind ideal für Zweiwege-Interaktion (Chat, Multiplayer, Live-Cursor). Wenn der Client vor allem Updates empfängt (Status-Änderungen, Benachrichtigungen, Dashboards), kann Server-Sent Events (SSE) einfacher und zuverlässiger sein, weil es eine normale HTTP-Verbindung nutzt und oft besser durch Proxies läuft.

Ein praktischer Fallback ist kontrollierte Degradation: Versuche WebSockets, wechsle zu SSE, wenn der Socket sich nicht öffnet oder zu oft droppt, falle auf kurzes Polling zurück, und wenn Reconnect weiterhin scheitert, schalte die App in einen eingeschränkten Modus (nur lesen oder „später senden“), während im Hintergrund ruhig weiter versucht wird.

Machen Sie die UI ehrlich: Zeigen Sie Verbindungsstatus (Verbunden, Wiederverbinden, Offline) und die Zeit der letzten Aktualisierung. Ein „Jetzt neu verbinden“-Button hilft, wenn jemand gerade das Netz gewechselt hat.

Serverseitig gestalten Sie Streams so, dass ein Client nach Reconnect fortsetzen kann. Senden Sie Events mit IDs oder Zeitstempeln und erlauben Sie „alles seit X“. Für SSE können Sie Last-Event-ID nutzen. Für WebSockets verwenden Sie einen Resume-Cursor oder Token beim Connect.

Häufige Fehler, die Sockets fragil machen

Nicht jeder Disconnect ist ein Bug. Mobile Netze fallen aus. Laptops schlafen. Browser pausieren Hintergrund-Tabs. Fragil wird es, wenn Ihre App normale Disconnects wie Notfälle behandelt und so aggressiv retryt, dass sie sich selbst eine Störung erzeugt.

Ein vermeidbarer Sicherheitsfehler ist, Geheimnisse in der URL zu platzieren. Query-Strings landen in Logs, Analytics, Fehlerberichten und Screenshots. Wenn Ihr Socket-Token in der URL ist, gehen Sie davon aus, dass es leaken wird. Beim Debugging ist es außerdem leicht, Tokens versehentlich zu loggen, wenn Handshakes gedumpt werden.

Lokale Entwicklung kann in die Irre führen. Auf localhost gibt es keinen Unternehmensproxy, keinen Load-Balancer und keine Idle-Timeout-Policy. In Produktion kann ein Proxy Idle-Verbindungen schließen, Header strippen oder Upgrade-Requests blockieren.

Einige Muster, die Sockets meist brittle machen:

  • Retry-Schleifen ohne Backoff oder Jitter.
  • Auth in Query-Strings oder Logging, das Tokens erfasst.
  • Keine serverseitigen Limits für Reconnect-Versuche pro Nutzer/IP.
  • Reconnect-Logik, die blind resubscribet und doppelte Listener erzeugt.
  • Tests ohne Proxy oder Load-Balancer überspringen.

Doppelte Subscriptions sind besonders heimtückisch. Nach einem Reconnect kann der Client demselben Room erneut beitreten oder denselben Handler registrieren, während der Server den alten Listener nie aufräumt. Lösen Sie das, indem Sie Subscriptions pro Verbindung idempotent machen und Connection-IDs tracken, sodass eine neue Socket-Verbindung die alte sauber ersetzen kann.

Schnelle Checks, bevor Sie den Fix ausrollen

Find the real cause fast
Get a free code audit to pinpoint what’s causing your WebSocket disconnect loop.

Bevor Sie eine WebSocket-Änderung ausrollen, machen Sie einen schnellen Durchlauf über Client, Server und Infrastruktur. Die meisten Disconnect-Schleifen sind nicht ein einziger Bug. Es sind zwei oder drei kleine Probleme, die zusammen auftreten.

Client-seitige Checks

Ihr Client sollte unter Fehlern ruhig bleiben. Nutzen Sie Reconnect-Backoff mit Jitter und einer Obergrenze, zeigen Sie den Verbindungsstatus in der UI, fügen Sie Resume-Logik (letzte Event-ID oder Version) hinzu, damit kurze Drops keine Daten verlieren, deduplizieren Sie Events, damit Reconnects keine doppelten Updates anwenden, und schließen Sie Sockets sauber bei Logout oder Kontowechsel.

Server- und Infrastruktur-Checks

Machen Sie Disconnects verständlich. Wenn der Server eine Verbindung schließt, sollte es einen klaren Grund geben und eine Log-Zeile sollte das erklären. Nutzen Sie klare Close-Codes, erzwingen Sie Auth beim Connect und bei sensitiven Messages, konfigurieren Sie Heartbeats und Timeouts so, dass gesunde Clients nicht gekickt werden, setzen Sie Verbindungs-Limits pro Nutzer/IP und überprüfen Sie Proxy/Load-Balancer-WebSocket-Einstellungen (inklusive Idle-Timeouts und ob Stickiness nötig ist).

Eine einfache Regel: Wenn Sie einen Disconnect nicht mit einer Log-Zeile erklären können, sind Sie nicht bereit zum Ausrollen.

Schnelle Tests, die Regressionen finden

Führen Sie Szenarien aus, die Schleifen oft reproduzieren: ein Nutzer mit vielen Tabs beim Ein- und Ausloggen, viele Nutzer, die gleichzeitig verbinden (auch ein kleiner Lasttest), Deploys während Nutzer verbunden sind beobachten und das Reconnect-Verhalten prüfen, sowie instabile Netzwerke simulieren (WLAN/Zellular umschalten, Laptop schlafen), um zu bestätigen, dass die App wiederherstellt.

„Fertig“ bedeutet: Verbindungen halten vorhersehbare Zeiten, Reconnects werden langsamer statt schneller, und wenn ein Drop passiert, können Sie auf eine klare Ursache zeigen.

Ein realistisches Beispiel und nächste Schritte

Ein Gründer launcht ein Live-Sales-Dashboard. In Staging perfekt. Am Launch-Tag kommen Support-Tickets: Die Seite blinkt alle paar Sekunden „Wiederverbinden…“ und einige Nutzer bekommen nie Live-Updates.

Der erste Hinweis steht in den Server-Logs: Viele Verbindungen enden direkt nachdem ein Access-Token abläuft. Auf dem Client reconnectt die App schnell, verwendet aber weiter dasselbe abgelaufene Token und wird wieder gekickt. Die Lösung ist, dass der Socket-Handshake ein frisches Token nutzt (oder ein kurzlebiges Socket-Token) und vor dem Reconnect ein Refresh erzwungen wird.

Dann tritt ein zweites Muster auf: Nutzer, die die Seite offenlassen, werden fast genau nach 60 Sekunden getrennt. Das weist auf ein Infrastruktur-Timeout hin. Der Load-Balancer schließt idle Verbindungen und die App sendet keine Heartbeats. Ein Ping alle 25 Sekunden plus ein vernünftiges Idle-Timeout stoppt das Flattern.

Dokumentieren Sie, was Sie geändert haben, damit es dauerhaft bleibt: erwartete Close-Codes, Token-Regeln für Sockets (woher, wann refreshen, Verhalten bei 401), Heartbeat-Settings (Ping-Intervall, Pong-Timeout) plus Proxy-Idle-Timeouts und Reconnect-Regeln (Backoff-Timing, max Versuche, wann stoppen und einen „Refresh“-Button zeigen).

Manchmal ist Patchen langsamer als ein Refactor. Wenn Ihr Socket-Handler Connection/Auth, Business-Logic, Datenbank-Schreiben und Permission-Checks mischt, erzeugen kleine Änderungen neue Fehler. Trennen Sie Verantwortlichkeiten: eine Schicht für Connection und Auth, eine für Events, eine für Daten.

Wenn Sie ein KI-generiertes Prototype haben, das in der Demo funktionierte, aber in Produktion ständig ausfällt: FixMyMess (fixmymess.ai) kann helfen, den Socket-Flow zu diagnostizieren, Auth- und Reconnect-Logik zu reparieren und die App für echten Traffic zu härten — nach einem kostenlosen Code-Audit.

Häufige Fragen

Why did my WebSocket real-time feature work in a demo but break after launch?

Weil Produktion echten Stress und „Dinge dazwischen“ hinzufügt. Mehr gleichzeitige Verbindungen, Proxies mit Idle-Timeouts, Token-Refresh-Zyklen, Schlaf- oder Netzwechsel auf Mobilgeräten und mehrere Serverinstanzen können ein in der Demo stabiles System in ständige Verbindungsabbrüche verwandeln.

What’s the minimum info I should log to debug a disconnect loop?

Protokollieren Sie eine knappe Timeline für eine Verbindung: Client- und Server-Zeitstempel, eine Nutzer-/Sitzungskennung, eine pro-Verbindung generierte ID, den Close-Code und Grund sowie die letzten Events vor dem Abbruch (open, auth, subscribe, ping/pong). Damit lässt sich meist erkennen, ob der Client verschwunden ist, ein Proxy die Verbindung beendet hat oder Ihr Server geschlossen hat.

What does WebSocket close code 1006 usually mean?

1006 ist ein abnormaler Abschluss — das heißt, der Browser hat kein sauberes Close-Frame erhalten. Das deutet oft auf Netzwerkabbrüche, Schlafmodus des Geräts, Proxy/Load-Balancer-Timeouts oder einen Servercrash hin, der die TCP-Verbindung ohne WebSocket-Close beendet hat.

How should I handle “unauthorized” socket closes without endless reconnecting?

Behandeln Sie das nicht wie einen instabilen Netzwerkfehler. Stoppen Sie die reconnect-Schleife, erneuern Sie zuerst Session oder Token und öffnen Sie dann eine neue Verbindung mit den aktuellen Zugangsdaten. Wenn Sie immer wieder mit demselben abgelaufenen Token verbinden, erzeugen Sie eine enge Schleife, die wie ein Netzwerkausfall aussieht, aber eigentlich Auth ist.

What heartbeat (ping/pong) timing should I use to prevent idle timeouts?

Beginnen Sie mit einem Heartbeat alle 15–25 Sekunden und betrachten Sie die Verbindung nach 2–3 ausgelassenen Antworten als tot, dann reconnecten Sie mit Backoff. Ziel ist, Zwischenstellen davon abzuhalten, die Verbindung als idle zu markieren, ohne mobilen Akku und Daten zu verschwenden.

How do proxies or load balancers cause random WebSocket disconnects?

Alles, was zwischen Browser und App sitzt, kann WebSockets beeinflussen: Reverse-Proxies, CDNs und Load-Balancer müssen HTTP-Upgrade unterstützen, benötigte Header erhalten und lang lebende Verbindungen zulassen. Ein typisches Problem ist ein Idle-Timeout von ~30–60 Sekunden, das ruhige Sockets tötet, wenn keine Heartbeats gesendet werden.

Do I need sticky sessions for WebSockets in production?

Wenn Sie wichtige Zustände im Speicher halten (Rooms, Presence, Subscriptions), kann eine Verbindung auf einer anderen Instanz landen und der Zustand fehlt — das führt zu vermissten Nachrichten oder fehlschlagenden Checks. Entweder verlagern Sie den Zustand in geteilten Speicher/pub-sub oder Sie stellen sicher, dass die Infrastruktur Sticky Sessions bietet, wenn Sie sie wirklich brauchen.

How do I stop duplicate messages after reconnects?

Nutzen Sie Event-IDs oder Sequenznummern und machen Sie beide Seiten retry-tolerant. Beim Reconnect sollte der Client von „last received“ weiterarbeiten und der Server Ereignisse idempotent verarbeiten, damit ein Replay nicht doppelte Buchungen, doppelte Datensätze oder doppelte Benachrichtigungen verursacht.

When should I use SSE or polling instead of WebSockets?

Wenn der Client hauptsächlich Updates empfängt und keine echte Zweiwege-Interaktion braucht, ist SSE oft einfacher und läuft zuverlässiger durch viele Proxies, weil es normales HTTP nutzt. Haben Sie immer eine kontrollierte Fallback-Strategie, damit die App auch bei flaky Sockets weiterarbeitet — wenn auch mit geringerer Echtzeit-Qualität.

When should I bring in FixMyMess to fix my real-time feature?

Wenn Ihre App ein KI-generiertes Prototype ist und Sie in einer reconnect-Schleife ohne erklärbaren Grund hängen bleiben, ist eine strukturierte Diagnose meist schneller als endloses Timeout-Tweaken. FixMyMess (fixmymess.ai) kann den Code auditen, feststellen ob Auth, Infrastruktur oder Skalierung die Ursache sind, und den Echtzeit-Flow für echten Traffic härten.