За устойчивост на обекта добавих Redissupport, използвайки node_redis. След това замених цикъла client.send върху масива от канали с Redis pub/subas слой на абстракция. Но забелязах, че трябва да създам нов клиент на Redis за всеки потребител, който е направил абонамент. И все още имах нужда да съхранявам клиентска информация за socket.io, за да изпращам съобщения при публикуване. Колко мащабируемо е това? Има ли други (по-добри) реализации или допълнителни оптимизации, които мога да направя? Какво бихте направили?
Да, трябва да създадете нов клиент на redis за всяка заявка за io. Той е тежък и не може да се мащабира. Но създаването на нова клиентска връзка на Redis не консумира много памет. Така че, ако броят на потребителите на вашата система не е повече от 5000, тогава е добре. За да мащабирате, можете да добавите подчинен redis сървър, за да разрешите тежкото публикуване и абониране и ако сте загрижени за създаването на много връзки, тогава можете да увеличите ОС ULIMIT.
Не е необходимо да съхранявате socket.io клиента в изпратеното съобщение. След повторното получаване на съобщение за абониран канал. Той ще изпрати съобщение до конкретен 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());
})