Как сохранить подписку пользователя на каждый чат, на который он подписан

введите описание изображения здесь

Это мессенджер 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 функция, которая вызывается для определенных событий вещания канала. Может использоваться для фильтрации или манипулирования исходящими сообщениями, транслируемыми по этому каналу.

Другие вопросы по тегам