18 Stimmen

Erfordert das Pub/Sub-Modell von Redis dauerhafte Verbindungen zu Redis?

Wenn ich in einer Webanwendung ein Ereignis in eine Warteschlange schreiben muss, würde ich eine Verbindung zu redis herstellen, um das Ereignis zu schreiben.

Wenn ich nun möchte, dass ein anderer Backend-Prozess (z.B. ein Daemon oder Cron-Job) das Ereignis verarbeitet oder auf die Veröffentlichung des Ereignisses in Redis reagiert, benötige ich dann eine persistente Verbindung?

Ich bin etwas verwirrt darüber, wie dieser Pub/Sub-Prozess in einer Webanwendung funktioniert.

47voto

antirez Punkte 17886

Grundsätzlich gibt es in Redis zwei verschiedene Nachrichtenmodelle:

  • Feuer und Vergessen / Einer zu vielen: Pub/Sub. Wenn eine Nachricht VERÖFFENTLICHT wird, erhalten sie alle Abonnenten, aber diese Nachricht ist dann für immer verloren. Wenn ein Kunde die Nachricht nicht abonniert hat, gibt es keine Möglichkeit, sie zurückzubekommen.
  • Persistierende Warteschlangen / One to One: Listen, die möglicherweise mit blockierenden Befehlen wie BLPOP verwendet werden. Bei Listen gibt es einen Produzenten, der in eine Liste schiebt, und einen oder mehrere Konsumenten, die auf Elemente warten, aber eine Nachricht erreicht nur einen der wartenden Kunden . Mit Listen haben Sie Persistenz, und die Nachrichten warten darauf, dass ein Client sie öffnet, anstatt zu verschwinden. Selbst wenn also niemand zuhört, gibt es einen Rückstand (so groß wie der verfügbare Speicher, oder Sie können den Rückstand mit LTRIM begrenzen).

Ich hoffe, das ist klar. Ich schlage vor, dass Sie die folgenden Befehle studieren, um mehr über Redis und die Semantik von Nachrichten zu erfahren:

  • LPUSH/RPUSH, RPOP/LPOP, BRPOP/BLPOP
  • VERÖFFENTLICHEN, ABONNIEREN, PSUBSCRIBE

Die Dokumentation für diese Befehle finden Sie unter redis.io

2voto

rm-rf Punkte 1273

Ich bin mir nicht ganz sicher, aber ich glaube, dass für pub/sub eine dauerhafte Verbindung erforderlich ist.

Als Alternative würde ich einen Blick werfen auf resque und wie es damit umgeht. Anstatt pub/sub zu verwenden, fügt es einfach ein Element zu einer Liste in redis hinzu, und dann kann jeder Daemon oder Cron-Job, den Sie haben, den Befehl lpop verwenden, um das erste Element zu erhalten.

Es tut mir leid, dass ich nur eine Pseudo-Antwort gegeben habe und dann einen Stecker.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X