Как сохранить подписку пользователя на каждый чат, на который он подписан
Это мессенджер Facebook пользовательского интерфейса
Если вы реализовали это с помощью Phoenix (фреймворк эликсира)
Вы бы создали один канал Феникс для одного чата?
Это означает, что ваш клиент (мобильный, интернет и т. Д.) Должен будет открыть один канал для каждого чата, на который он подписан.
Это означает, что если в нем есть 2000 чатов, то ему придется открыть 2000 каналов (загрузка клиента).
Вы бы создали один канал Феникс для одного пользователя?
Что подразумевает, что ваш клиент (мобильный, веб и т. Д.) Должен будет открыть только один канал и
Это подразумевает, что для каждого входящего сообщения вам придется запрашивать всех пользователей в комнате (загрузка сервера).
1 ответ
В приложениях обмена сообщениями есть две основные проблемы. Управление списком ресурсов (пользователи, комнаты и т. Д.), На которые подписан пользователь. Обычно это отображается в виде списка в клиенте. Таким образом, вам нужно отобразить этот список и обновить его на наличие таких мыслей, как присутствие, оповещения о новых сообщениях и, возможно, показ, если у пользователя есть открытое окно чата. Решение для этой части аналогично, независимо от того, являются ли пользователи / комнаты двухточечными или многопользовательскими (комнаты).
Второй проблемой является отображение сообщений в отдельных окнах чата, которые открыты / видимы. Решение для этого может варьироваться в зависимости от того, являются ли они двухточечными или многопользовательскими. Однако Facebook поддерживает многопользовательский чат, поэтому я отвечу на этот вопрос, основываясь на моем опыте создания клона Slack в Фениксе.
Я рекомендую два канала, один для пользователей и один для открытых окон чата, давайте назовем это чатом. У каждого пользователя будет 1 экземпляр пользовательского канала и экземпляр канала чата для каждого открытого окна чата. User_id может использоваться для темы пользовательского канала, например "user:" <> user.user_id
, Вероятно, у вас будет схема для каждого сеанса чата (использование которого является частью сеанса чата). Так что используйте этот идентификатор для темы канала чата, как "chat:" <> chat.id
,
Затем вы можете транслировать новые входящие сообщения в канале чата, и они будут доступны всем в этом сеансе чата (людям, у которых открыто окно чата). Это будет работать как для двухточечных, так и для многопользовательских окон.
Пример, который вы предоставили в вопросе, показывает два варианта использования с различным состоянием (цвет текста). Один показывает пропущенный вызов, а другой, я полагаю, указывает на непрочитанное сообщение. Этот тип состояния обычно специфичен для пользователя, поэтому вы должны использовать канал использования push
эта информация.
Для отслеживания индикаторов в списке пользователей вы можете подписаться на сообщения в канале чата из пользовательского канала. Затем вы будете получать информационные сообщения в канале пользователя и при необходимости предпринимать соответствующие действия. Если вы подписаны на сообщения чата, вы можете создать их список и сохранить в своем socket.assigns
структура. Смотрите Phoenix Channels - Несколько каналов на сокет для более подробной информации.
Другой API, который я использую для приложений обмена сообщениями, - это intercept
апи. Это позволяет вам определить handle_out
функция, которая вызывается для определенных событий вещания канала. Может использоваться для фильтрации или манипулирования исходящими сообщениями, транслируемыми по этому каналу.