Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis Pub/Sub mit Zuverlässigkeit

Wenn ein Abonnent (Verbraucher) stirbt, wird Ihre Liste weiter wachsen, bis der Kunde zurückkehrt. Ihr Produzent könnte die Liste (von beiden Seiten) kürzen, sobald sie eine bestimmte Grenze erreicht, aber das müssten Sie auf Anwendungsebene handhaben. Wenn Sie in jede Nachricht einen Zeitstempel einfügen, kann Ihr Verbraucher auf das Alter einer Nachricht reagieren, vorausgesetzt, Sie haben eine Anwendungslogik, die Sie für das Nachrichtenalter erzwingen möchten.

Ich bin mir nicht sicher, wie eine fehlerhafte Nachricht in das System gelangen würde, da die Verbindung zu Redis normalerweise TCP mit den zugehörigen Integritätsgarantien ist. Aber wenn dies passiert, vielleicht aufgrund eines Fehlers in der Nachrichtencodierung auf der Erzeugerebene, könnten Sie einen allgemeinen Mechanismus zur Behandlung von Fehlern bereitstellen, indem Sie eine Warteschlange pro Erzeuger führen, die die Ausnahmemeldungen des Verbrauchers empfangen hat.

Wiederholungsrichtlinien hängen stark von den Anforderungen Ihrer Anwendung ab. Wenn Sie eine 100-prozentige Gewissheit benötigen, dass eine Nachricht empfangen und verarbeitet wurde, sollten Sie die Verwendung von Redis-Transaktionen (MULTI/EXEC) in Betracht ziehen, um die von einem Verbraucher geleistete Arbeit zu verpacken, damit Sie sicherstellen können, dass ein Client eine Nachricht nicht entfernt, es sei denn es hat seine Arbeit vollendet. Wenn Sie eine explizite Bestätigung benötigen, können Sie eine explizite ACK-Nachricht in einer Warteschlange verwenden, die den Erzeugerprozessen zugeordnet ist.

Ohne mehr über Ihre Anwendungsanforderungen zu wissen, ist es schwierig, eine kluge Auswahl zu treffen. Wenn Ihre Nachrichten einen vollständigen ACID-Schutz erfordern, müssen Sie im Allgemeinen wahrscheinlich auch Redis-Transaktionen verwenden. Wenn Ihre Nachrichten nur dann sinnvoll sind, wenn sie rechtzeitig sind, sind Transaktionen möglicherweise nicht erforderlich. Es hört sich so an, als ob Sie gelöschte Nachrichten nicht tolerieren können, also ist Ihr Ansatz, eine Liste zu verwenden, gut. Wenn Sie eine Prioritätswarteschlange für Ihre Nachrichten implementieren müssen, können Sie den sortierten Satz (die Z-Befehle) verwenden, um Ihre Nachrichten zu speichern, wobei ihre Priorität als Score-Wert verwendet wird, zusammen mit einem Polling-Consumer.