Redis-Stream
SocketIO4J verwendet den Redisson-Client, um eine Verbindung zu einem Redis-Server herzustellen. Alternative mit Redis kompatible Backends wie Valkey und DragonflyDB könnten ebenfalls unterstützt werden.
Das RedisStreamEventStore bietet einen verteilten, streamingbasierten Ereignisspeicher für socketio4j unter Verwendung von Redis Streams (XADD / XREAD). Es ermöglicht horizontale Skalierung, indem Ereignisse über mehrere Serverinstanzen synchronisiert werden, sodass interner Zustand, Raumzugehörigkeiten und andere verteilte Operationen über Knoten hinweg konsistent bleiben.
Redis Reliable Pub/Sub verwendet intern Streams für Persistenz, exponiert jedoch keine Offsets; Redis Streams stellt Offsets direkt zur Verfügung, was kontrolliertes Replay und Wiederherstellung des Verbindungszustands ermöglicht (für die Entwicklung geplant).
Wesentliche Merkmale
Verteiltes Streaming — verwendet Redis Streams, um Ereignisse an alle aktiven Knoten zu liefern
Fortlaufendes Ereignisreplay — speichert kürzliche Ereignisse in der Stream-Historie und ermöglicht kontrolliertes Replay
Offset-Verfolgung pro Ereignistyp — jeder Ereignistyp verwaltet seinen eigenen zuletzt gesehenen
StreamMessageIdStreaming-Dispatch — Ereignisse werden asynchron verarbeitet, ohne die Netty-Event-Loops zu blockieren
Duplikatvermeidung — von demselben Knoten erzeugte Ereignisse werden mit
nodeId
Funktionsweise
Jede Veröffentlichung führt ein
XADDan einem Redis-Stream durch (ein einzelner Stream oder pro Typ, abhängig vom Modus)Jeder Ereignistyp verwaltet seinen eigenen Leseoffset mithilfe von
StreamMessageIdDas Polling wird in dedizierten, geplanten Executor-Threads pro Ereignistyp durchgeführt
Bei jedem Lesen (
XREAD) werden nur Nachrichten mit Offsets, die neuer sind als die zuletzt verarbeitete ID, verarbeitetEreignisse werden Listenern nur zugestellt, wenn sie von einem anderen Knoten stammen
Bei Fehlern oder Stream-Timeouts werden Wiederholungsversuche automatisch geplant
Modi
MULTI_CHANNEL
Separater Redis-Stream pro Ereignistyp
Standard; isoliert Ereignisverkehr und reduziert Konkurrenz
SINGLE_CHANNEL
Alle Ereignisse werden in ALL_SINGLE_CHANNEL
Wenn eine globale Reihenfolge aller Ereignistypen über Knoten hinweg erforderlich ist
Vorteile
👍 Funktioniert gut für Multi-Node-Bereitstellungen 👍 Nachrichten können je nach Stream-Länge vorübergehende Ausfallzeiten von Abonnenten überstehen 👍 Bietet offset-basierte Zustellung 👍 Unterstützt kontrolliertes Replay neuer Ereignisse nach Neustarts (Wiederherstellung des Verbindungszustands wird entwickelt, vorerst erhalten Sie die Nachrichten-Offset) 👍 Verwendet grundlegende Redis-Streams-Primitiven ohne externe Broker
Einschränkungen
ℹ️ Konsumenten verarbeiten Nachrichten unabhängig — die Reihenfolge gilt pro Stream, nicht global ℹ️ Potenzielle doppelte Zustellung bei Neustarts oder Offset-Grenzkonkurrenzen ℹ️ Erfordert Unterstützung für Redis Streams (nicht kompatibel mit dem Legacy-Redis-Pub/Sub-Modus)
Zustellgarantie: Mindestens-einmal-Semantik — Ereignis-Listener müssen idempotent sein, um mögliche doppelte Nachrichten zu verarbeiten.
Zuletzt aktualisiert
War das hilfreich?