#javascript #nodejs #сервер #websocket
Стало непонятно: при каждом обновлении страницы у пользователя, на сервере создается новый объект соединения.. Вопрос: Как держать этот объект актуальным? Пришло в голову хранить это соединение в БД и при создании нового соединения, обновлять значение из этой БД для определенного пользователя... то есть, есть некая структура: user_id | socket 34 | {obj} есть пользователь с идентификатором 34, у него есть свой объект соединения ws, который храниться в socket, и как я уже говорил, - при каждом создании нового соединения, будет обновляться значения из поля socket скажите правильно ли это? P.S. Для сайта вопросов-ответов
Ответы
Ответ 1
Пришло в голову хранить это соединение в БД Хо-хо-о! Эм, нет, это плохая идея. Соединение вещь очень контекстная для конкретного процесса и её не стоит класть в общедоступное хранилище, т. к. если его заберёт оттуда другой процесс, он не получит работающего соединения, поскольку ОС выделяла ресурсы на это другому процессу. ...это при условии, если у вас получится объект соединения сериализовать в последовательность байт для записи в БД (база ведь хранит данные). А скорее всего, вся затея оборвётся уже на этом этапе, т. к. вы просто не сможете получить необходимых для воспроизведения данных даже в рамках того же процесса. Плюс надо иметь в виду, что пользователь может находиться на сайте с нескольких вкладок и/или даже устройств одновременно, и наверное, вам нужно уметь держать несколько активных соединений на одного пользователя сразу. Вы уже чувствуете этот дух приключений? Если вы работаете всего с одним процессом, то вы можете хоть в глобальном объекте их хранить. Нечто похожее socket.io и делает по умолчанию, а socket.io-express-session из ответа @Darth вам поможет быстрее сопоставлять пользователей и соединения. Но это ещё не конец истории, если ваше приложение работает в нескольких процессах. Потому что пользователь, подключившись к процессу, висит только на нём. Послать сообщение ему в соединение из другого процесса вашего же приложения будет невозможно. Для этого придуман socket.io-adapter (абстрактный) и его реализации, например socket.io-redis, дающий связь между процессами приложения через Redis. В этом случае свои соединения каждый процесс всё равно хранит где-то у себя, в глобальном объекте, но другие процессы даже при этом всё равно могут к ним обращаться.Ответ 2
Воспользуйтесь модулем socket.io-express-session. Тогда вы сможете пользоваться всеми преимуществами сессий и вам не надо будет придумывать велосипед, для того чтобы каждый раз передать id юзера при переподключении
Комментариев нет:
Отправить комментарий