Ich baue eine Echtzeit-Visualisierung mit redis als pubsub Messenger zwischen Python und Node. Es gibt immer ein Python-Skript, das einen Redis-Hash mit hmset setzt. Diese Seite der App funktioniert gut, wenn ich den folgenden Beispielbefehl eingeben: "HGETALL 'sellers-80183917'" in einem Redis-Client bekomme ich die richtigen Daten.
Das Problem liegt in der js-Seite. Ich benutze die Bibliotheken socketio und redis nodejs, um die Redis-Instanz anzuhören und die Ergebnisse online über eine d3js-Datei zu veröffentlichen.
Ich führe den folgenden Code mit Knoten:
%Vor%Und das ist der relevante Teil der seller.ejs-Datei, die die Benutzeranfragen empfängt und die Viz ausgibt:
%Vor%Das Problem ist, dass die Methode socket_on () niemals etwas empfängt und ich sehe nicht, wo das Problem liegt, da sonst alles gut zu funktionieren scheint.
Ich denke, Sie könnten verwirrt sein, was Pub / Sub in Redis eigentlich ist. Es ist nicht eine Möglichkeit, Änderungen an Hashes zu hören. Sie können einen Pub / Sub Kanal namens sellers-1
haben, und Sie können einen Hash mit dem Schlüssel sellers-1
haben, aber diese haben keinen Bezug zueinander.
Wie dokumentiert hier :
Pub / Sub hat keine Beziehung zum Schlüsselraum.
Es gibt eine Sache namens Schlüsselbereichsbenachrichtigungen , mit der Änderungen im Schlüsselbereich (über Pub / Sub-Kanäle) abgehört werden können ); Diese Funktion ist jedoch standardmäßig nicht aktiviert, da sie mehr Ressourcen beansprucht.
Vielleicht wäre es eine einfachere Methode, eine Nachricht nach HMSET
zu veröffentlichen, damit alle Abonnenten wissen, dass der Hash geändert wurde (sie würden dann den Hash-Inhalt selbst abrufen oder die veröffentlichte Nachricht würde die relevanten Daten enthalten).
Dies bringt uns zum nächsten möglichen Problem: Sie haben nur eine Teilnehmerverbindung, redisSubscriber
.
Nach meinem Verständnis aus dem Node.js Redis-Treiber würde das Aufrufen von .subscribe()
für eine solche Verbindung frühere Abonnements zugunsten des neuen entfernen. Wenn Sie also zuvor den sellers-1
-Kanal abonniert und sellers-2
abonniert hatten, würden Sie keine Nachrichten mehr vom sellers-1
-Kanal empfangen.
Sie können mehrere Kanäle abhören, indem Sie entweder ein Array von Kanälen übergeben oder sie als Argumente übergeben:
%Vor%Sie müssten natürlich jedes "aktive" Verkäufer-Abonnement verfolgen. Entweder das, oder erstellen Sie eine neue Verbindung für jedes Abonnement, was auch nicht ideal ist.
Es ist wahrscheinlich eine bessere Idee, einen einzigen Pub / Sub-Kanal zu haben, auf dem alle Änderungen veröffentlicht werden, anstatt einen separaten Kanal für jeden Verkäufer.
Schließlich: Wenn Ihre Verkäufer-IDs nicht schwer zu erraten sind (zum Beispiel, wenn sie auf einem inkrementellen Integer-Wert basiert), wäre es für jemanden einfach, einen Client zu schreiben, der es jedem Verkäufer ermöglicht, zuzuhören Kanal, den sie möchten. Es ist vielleicht kein Problem, aber ist etwas, das Sie beachten sollten.