Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

WebSocket - Как правильно хранить соединения?

#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 юзера при переподключении

Комментариев нет:

Отправить комментарий