Dla trwałości obiektów dodałem Redissupport za pomocą node_redis. Następnie zamieniłem pętlę client.send na tablicę kanałów na warstwę abstrakcji Redis pub/subs. Zauważyłem jednak, że muszę utworzyć nowego klienta Redis dla każdego użytkownika, który dokonał subskrypcji. I nadal potrzebowałem przechowywać informacje o kliencie socket.io, aby wysyłać wiadomości do publikowania. Jak skalowalne jest to? Czy mogę dokonać innych (lepszych) implementacji lub dalszych optymalizacji? Co byś zrobił?
Tak, musisz utworzyć nowego klienta redis dla każdego żądania io. Jest ciężki i nie jest skalowalny. Ale utworzenie nowego połączenia klienta Redis nie zużywa dużo pamięci. Więc jeśli liczba użytkowników systemu nie przekracza 5000, to jest w porządku. Aby skalować, możesz dodać podrzędny serwer redis, aby rozwiązać problem publikowania i subskrybowania, a jeśli martwisz się tworzeniem wielu połączeń, możesz zwiększyć uLIMIT systemu operacyjnego.
Nie musisz przechowywać klienta socket.io w wysłanej wiadomości. Po odebraniu wiadomości redis zasubskrybowanego kanału. Wyśle wiadomość do konkretnego klienta io.
subscribe.on("message",function(channel,message) {
var msg = { message: [client.sessionId, message] };
buffer.push(msg);
if (buffer.length 15) buffer.shift();
client.send(msg); > });
Aby subskrybować wiele kanałów. Proponuję wstępnie zapisać wszystkich użytkowników z więcej niż jednym kanałem (możesz użyć pamięci Mongodb lub redis).
var store = redis.createClient();
var subscriber= redis.createClient()
store.hgetall(UID, function(e, obj){
subscriber.subscribe(obj.ChannelArray.toArray());
})