Socket.IO хранит активных пользователей - PullRequest
0 голосов
/ 08 октября 2018

У меня запущен проект приложения чата, и я обычно сохранял всех активных пользователей в массиве, выдвигая их userIds, сокеты и socket.ids, а затем просто вырезал из массива, как только пользователь отключился.Однако, как только будет другой сервер, я столкнусь с проблемой.Совместное использование памяти.Один сервер не будет знать, какие «активные пользователи» есть на другом, и наоборот.Есть ли быстрый и простой способ решить эту проблему?Возможно, я мог бы хранить эти сессии в MongoDB?Или Redis - единственный вариант?

  io.sockets.on('connection', async (socket, next) => {
  const token = socket.handshake.query.token;
  const decoded = await jwt.decodeId(token);
  const userId = decoded.id;
  await socketUtil.handleUserConnection(userId, socket.id);
  socket.on('disconnect', async () => {
    await socketUtil.handleUserDisconnect(socket.id);
  });
});

export const handleUserConnection = async (userId, socketId) => {
  const sum = await Sock.countDocuments();
  const socket = await Sock.create({
    leasedAt: new Date(),
    userId,
    socketId,
  });
  if (!socket) {
    logger.error('Socket creation error:', socketId);
  }
  logger.info(userId + ' connected (' + sum + ')');
};

export const handleUserDisconnect = async (socketId) => {
  const sum = await Sock.countDocuments();
  logger.info('User disconnected (' + sum + ')');
  await Sock.deleteMany({ socketId });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...