Храните свежие данные в памяти для Socket.IO
Я создаю веб-приложение Node.js с использованием Socket.IO.
В настоящее время я использую Passport.js и его промежуточное ПО для Socket.IO, которое предоставляет мне user
объект (который загружается из MySQL логикой десериализации Passport.js) аутентифицированного пользователя для каждого сокета:
io.on('connection', function (socket) {
const user = socket.request.user;
socket.on('event', (data) => {
// ...
});
});
Тем не менее, данные в user
исправлено (загружается в момент подключения), поэтому я не могу использовать какие-либо "нестатические" свойства пользователя в обратных вызовах для событий сокета.
Пример: пользователь отправляет сообщение чата, и я хочу передать его в текущую комнату этого пользователя (определяется user_id
поле пользователя в MySQL). Запрашивать относительно медленный MySQL каждый раз, когда происходит событие, очевидно, не вариант (я также собираюсь отправлять некоторые события много раз в секунду, например, рисование в реальном времени).
Вопрос № 1: Как правильно решить эту задачу? В настоящее время я имею в виду Redis (т.е. сохраняйте обязательные данные или дублируйте все данные в Redis и проверяйте Redis для каждого события (должно быть достаточно быстро?)).
Вопрос № 2: Если использование Redis, как я описал, является приемлемым методом, то какова лучшая практика для обработки таких дублированных данных? Я имею в виду, что любой код, который изменяет некоторые данные "Нужно быть свежим в Redis" в базе данных, теперь должен обновлять его и в Redis. Может быть, создать дополнительный уровень абстракции в коде, примерно как userService.setRoom()
обновление как БД, так и Redis, и этот метод должен вызываться везде вместо прямых изменений, как раньше? Звучит как приличный объем дополнительной работы, но я не уверен в других способах достижения этого.
Заранее спасибо.