Могу ли я добавить назначения в «основной сокет» после того, как соединение уже установлено?

Как объясняется в в этом сообщении, когда клиент впервые подключается к серверу, создается «основной сокет/процесс», который содержит свои назначения. Позже, когда клиент присоединяется к определенным каналам/темам, сокет/процесс каждого канала копирует эти назначения и может добавлять к ним по своему усмотрению.

Теперь у меня есть вариант использования, когда после присоединения пользователя к своему индивидуальному каналу (i.e. user:#{user_id}) я получаю некоторую информацию о пользователе из БД, которая затем должна быть глобально доступна для всех каналов, к которым позже присоединится этот пользователь. Однако я не смог найти способ поместить эту информацию в socket.assigns, чтобы она была доступна везде. Если я попытаюсь назначить их, они будут доступны только в socket.assigns этого конкретного user:#{user_id} канала.

Есть ли способ сделать это? Должен ли я вместо этого просто попытаться получить всю эту информацию за один раз, когда пользователь впервые подключается, а не когда они присоединяются к отдельному пользовательскому каналу?


person xji    schedule 31.12.2018    source источник


Ответы (1)


Разные каналы означают разные сокеты.

Самым простым решением было бы поддерживать постоянное состояние (Agent, ETS, DETS, mnesia, ...), удерживая карту user_id => user_info и запрашивая это состояние всякий раз, когда вам нужна эта информация.

person Aleksei Matiushkin    schedule 31.12.2018