Для сохранения объекта я добавил поддержку Redis, используя node_redis.Затем я заменил цикл client.send в массиве каналов на Redis pub / sub как слой абстракции.Но я заметил, что мне нужно было создать новый клиент Redis для каждого пользователя, который сделал подписку.И мне все еще нужно было хранить информацию о клиенте socket.io для отправки сообщений на публикацию.Насколько это масштабируемо?Есть ли другие (лучшие) реализации или дальнейшие оптимизации, которые я мог бы сделать?Что бы вы сделали?
Да, вы должны создавать новый клиент Redis для каждого запроса ввода-вывода.Это тяжелый и не масштабируемый.Но создание нового подключения клиента Redis не занимает много памяти.Так что, если количество пользователей вашей системы не превышает 5000, это нормально.Для масштабирования вы можете добавить в подчиненный сервер Redis, чтобы разрешить интенсивную публикацию и подписку, и если вы беспокоитесь о создании большого количества подключений, вы можете увеличить вашу ОС uLIMIT.
Вам не нужно хранить сокет.IO клиент в сообщении отправлено.После того, как redis получил подписанное сообщение канала.Он отправит сообщение определенному клиенту 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); > });
Чтобы подписаться на несколько каналов.Я предлагаю вам предварительно сохранить всех пользователей с более чем одним каналом (вы можете использовать хранилище Mongodb или Redis).
var store = redis.createClient();
var subscriber= redis.createClient()
store.hgetall(UID, function(e, obj){
subscriber.subscribe(obj.ChannelArray.toArray());
})