Jestem nowy w redis pub/sub. Mam system czatu w systemie, który przypomina komunikator. Więc chciałbym użyć redis pub/sub. Po zbadaniu próbek większość z nich została zaprojektowana w oparciu o chat room. W moim systemie będę mieć wiele pokojów rozmów między użytkownikami takimi jak;Jak zaprojektować redis pub/sub dla systemu wiadomości błyskawicznych?
A:B
A:C
D:C
E:F
Linie powyżej to pokoje. I zaimplementowałem serwer z node.js jak poniżej;
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))
});
});
});
Jak widać, tworzę nowego subskrybenta redis dla każdego połączenia. W innych pokojach rozmów abonenta klient redis jest tworzony globalnie. I istnieją tylko trzy połączenia przez cały czas, co rozwiązuje ich problem, ponieważ kiedy wydawca publikuje komunikat, wszyscy podłączeni klienci powinni go otrzymać. Ale mam tu przymus. Chcę otworzyć sesję czatu między dwoma użytkownikami i tylko ci użytkownicy powinni być subskrybentami. Powyższy kod działa tak, jak chciałbym, ale nie wiem, czy jest w porządku, aby redis utworzył nowego klienta abonenta dla każdego połączenia.
Byłoby miło usłyszeć twoje sugestie. Z góry dziękuję.
Dziękuję za szczegółową odpowiedź. Wiedziałem, że socket.io ma pojęcia pokoju ale nie zdawałem sobie sprawy z tego, że używam pub/sub za kulisami, spróbuję tego i na pewno rozpocznę testy porównawcze, obecnie staram się znaleźć dobry punkt wyjścia. sugestie: –
@ AliErsöz: Świetnie. Jeśli dowiesz się, że moja odpowiedź była zadowalająca, rozważ zaakceptowanie jej jako poprawnej odpowiedzi, klikając duży znacznik wyboru w lewym górnym rogu. –