масштабировать приложение чата с помощью публикации и подписки Адаптер redis.io-redis не работает - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь масштабировать свое приложение чата с помощью адаптера 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 вручную. Так что, если мне придется руководить пабом / сабом, не могли бы вы привести пример

...