Я пытаюсь масштабировать свое приложение чата с помощью адаптера sub / pub redis.io-redis
, но не работает с кластерным режимом, я не уверен, что я сделал не так. вот мой код сервера:
вот мой server.js этот файл сделает кластерный режим и инициализирует экспресс
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
for (let index = 0; index < os.cpus().length; index++) {
cluster.fork();
}
} else {
const express = require('express');
const app = express();
const chatCat = require('./app');
app.use(chatCat.session);
app.use(passport.initialize());
app.use(passport.session());
app.use('/', chatCat.router);
chatCat.ioServer(app).listen(app.get('port'), () => {
console.log('chatCAT Running on Port:', app.get('port'));
});
}
вот приложение \ index.js
const redis = require('redis').createClient;
const adapter = require('socket.io-redis');
let ioServer = app => {
const server = require('http').Server(app);
const io = require('socket.io')(server);
io.serveClient('transports', ['websocket']);
let pubClient = redis(config.redis.port, config.redis.host, {
auth_pass: config.redis.password
});
let subClient = redis(config.redis.port, config.redis.host, {
auth_pass: config.redis.password,
return_buffers: true
});
io.adapter(
adapter({
pubClient,
subClient
})
);
io.use((socket, next) => {
require('./session')(socket.request, {}, next);
});
require('./socket')(io, app);
return server;
}
а вот сокет / index.js
module.exports = (io, app) => {
let allrooms = app.locals.chatrooms;
io.of('/roomslist').on('connection', socket => {
socket.on('getChatrooms', () => {
console.log('allrooms', allrooms);
socket.emit('chatRoomsList', JSON.stringify(allrooms));
});
socket.on('createNewRoom', newRoomInput => {
if (!h.findRoomByName(allrooms, newRoomInput)) {
allrooms.push({
room: newRoomInput,
roomID: h.randomHex(),
users: []
});
socket.emit('chatRoomsList', JSON.stringify(allrooms));
socket.broadcast.emit('chatRoomsList', JSON.stringify(allrooms));
}
});
});
}
allrooms
- это комната списка, в моем приложении, когда пользователь входит в систему, пользователь увидит список комнаты, но иногда они видят, что это не так, а я отлаживаю и вижу, что переменная allrooms пуста. я изучаю какое-то руководство, и пример просто подключаю адаптер redis io.adapter(adapter({pubClient,subClient}));
к разъему.
Интересно, будет ли сокет автоматически позаботиться об этом сам или мне придется использовать pub / sub вручную. Так что, если мне придется руководить пабом / сабом, не могли бы вы привести пример