Ответ 1
На момент написания этой статьи:
Адаптер redis расширяет базовый адаптер, но он только переопределяет/добавляет следующие свойства:
-
onmessage
-
broadcast
-
add
-
del
-
delAll
С помощью этого кода:
io.sockets.adapter.rooms["CLIENT_1"];
вы запрашиваете свойство rooms
. Это не было отменено адаптером redis, поэтому вы действительно запрашиваете базовый адаптер, который знает только о комнатах/клиентах в текущем процессе.
Почему адаптер redis не переопределил свойство rooms
? Поскольку для соответствия точной сигнатуре вызова выше, он должен будет запросить экземпляр redis для построения объекта, содержащего все комнаты и соединения, каждый раз, когда к нему обращаются свойства. Нехорошо. (То есть, если вы не можете выяснить, как вычислить значения объектов во время запроса их значений.)
Если вы хотите получить количество подключений к "CLIENT_1"
для всех процессов в кластере, вам придется добавить эту функциональность в самого адаптера с помощью такого метода:
/**
* Count the number of connections in a room.
*
* @param {String} room id
* @param {Function} callback (optional)
* @api public
*/
Redis.prototype.numClients = function(room, fn){ ... }
в котором вы будете запрашивать экземпляр redis db.
IMO, это должно быть частью интерфейса базового адаптера для всех других адаптеров для реализации. Это общая проблема.