Ich bin neu in Redis Pub/Sub. Ich habe eine Chat-Funktion im System, die wie IM ist. Also würde ich gerne redis pub/sub benutzen. Wie ich die Proben untersucht habe, sind die meisten von ihnen basierend auf einem Chat-Room entworfen. In meinem System werde ich mehrere Chat-Räume zwischen Benutzern haben wie;Wie Redis Pub/Sub für ein Instant Messaging-System zu entwerfen?
A:B
A:C
D:C
E:F
Also, die Zeilen oben sind die Zimmer. Und ich habe den Server mit node.js wie unten implementiert;
var store = redis.createClient();
var pub = redis.createClient();
io.sockets.on('connection', function (socket) {
var sub = redis.createClient();
sub.on("message", function(pattern, data){
data = JSON.parse(data);
socket.send(JSON.stringify({ type: "chat", key: pattern, nick: data.nickname, message: data.text }))
}
});
socket.on('message', function (messageData) {
store.incr("messageNextId", function(e, messageId) {
var room = ""
var from = messageData.clientId > socket.nickname ? socket.nickname : messageData.clientId;
var to = messageData.clientId < socket.nickname ? socket.nickname : messageData.clientId;
room = from + ":" + to;
var message = { id: messageId, nickname: socket.nickname, text: messageData.text };
store.rpush("rooms:" + room, JSON.stringify(message), function(e, r) {
pub.publish(room, JSON.stringify(message))
});
});
});
Wie Sie sehen können, erstelle ich einen neuen Redis-Abonnenten für jede Verbindung. In anderen Chat-Room-Beispielen wird der Redis Subscriber-Client global erstellt. Und es gibt immer nur drei Verbindungen, und das löst ihr Problem, denn wenn ein Herausgeber eine Nachricht veröffentlicht, sollten alle verbundenen Clients sie bekommen. Aber ich habe hier eine Einschränkung. Ich möchte eine Chat-Sitzung zwischen zwei Benutzern öffnen und nur diese Benutzer sollten die Abonnenten sein. Der obige Code funktioniert wie ich möchte, aber ich weiß nicht, ob es für redis in Ordnung ist, einen neuen Abonnenten-Client für jede Verbindung zu erstellen.
Es wäre schön, Ihre Vorschläge zu hören. Danke im Voraus.
Dank für die ausführliche Antwort. Ich wusste, dass socket.io hat das Raumkonzept Aber ich wusste nicht, dass es Pub/Sub hinter den Kulissen benutzt, ich werde es versuchen und ich werde die Benchmark Tests starten, momentan versuche ich nur einen guten Startpunkt zu finden Vorschläge –
@ AliErsöz: Großartig.Wenn Sie herausfinden, meine Antwort war zufriedenstellend, bitte betrachten Sie es als die richtige Antwort akzeptieren, indem Sie auf das große Häkchen oben links klicken. –