MQTT для общения с клиентами в чате

Я хочу разработать приложение для чата и использовать MQTT и веб-сокет для живого уведомления, активного статуса на клиенте (в основном в веб-браузере). Мне интересно, как я могу наилучшим образом наладить связь между клиентами, чтобы снизить нагрузку на MQTT и обеспечить бесперебойную связь.

Например, если клиент A отправляет сообщение клиенту B, тогда варианты

1) Создайте отдельную тему для общения между клиентом А и клиентом Б

Это не выглядит хорошей идеей, так как если количество клиентов в приложении увеличится, то количество тем между каждым пользователем сильно увеличится, что создаст нагрузку на брокера MQTT.

2) Отправить сообщение на основе уникального идентификатора клиента

MQTT не позволяет публиковать сообщения на основе идентификатора клиента

3) Сделать единую тему для общения между всеми клиентами (все клиенты подпишутся на тему и соответствующий клиент выполнит свою операцию, если сообщение относится к ней)

Многие клиенты будут получать нежелательные сообщения, и по мере роста числа клиентов это усугубит проблему.

В случае, если все клиенты подписываются на одну тему, можно ли отфильтровать клиента, который должен получить сообщение

Какие могут быть другие решения для создания удобного приложения для чата и какое решение используют другие приложения, такие как slack, telegram, whatsapp и т. д.. Используют ли они также MQTT, и если нет, то как они этого добиваются.

Заранее спасибо


person Jayendra Singh    schedule 17.05.2021    source источник


Ответы (1)


Ваше понимание пункта 1 ошибочно.

Темы имеют почти нулевые накладные расходы на брокера. Наличие миллионов тем не является проблемой. Единственные накладные расходы:

  • Список тем, на которые подписан клиент, на самом деле не проблема
  • Сообщения в очереди для автономного клиента с постоянной подпиской. На это никоим образом не влияет количество тем, а только количество сообщений, отправленных этому клиенту, когда он находится в автономном режиме.

Единственные накладные расходы на обработку сообщения — это проверка списка тем, на которые подписан данный клиент (возможно, с небольшой проверкой ACL), а затем накладные расходы на фактическую отправку пакетов TCP/IP для отправки этого сообщения клиенту.

person hardillb    schedule 17.05.2021
comment
Что, если я введу микросервис в качестве посредника между клиентами. этот микросервис будет устанавливать соединение с каждым клиентом, используя тему MQTT, и будет выступать в качестве посредника. Таким образом, Microservice подпишется на каждую клиентскую тему и сохранит сообщения в базе данных в виде истории сообщений, и если клиент-получатель находится в сети, он одновременно опубликует сообщение в теме клиента-получателя, а если он не в сети, то сообщения уже находятся в БД. Таким образом, всякий раз, когда получатель подключается к сети, он может вызывать API для получения истории сообщений. - person Jayendra Singh; 18.05.2021
comment
Добавление еще одного клиента ничего не изменит - person hardillb; 18.05.2021
comment
Клиент микросервиса всегда будет в сети, и как только клиент браузера будет в сети, он может получить старые сообщения из базы данных, вызвав API, таким образом, брокеру не потребуется хранить какую-либо информацию. Таким образом, не будут удалены накладные расходы (для количества сообщений, отправленных этому клиенту, когда он находится в автономном режиме) - person Jayendra Singh; 18.05.2021
comment
@JayendraSingh это действительно хорошая идея, пока на самом деле это не сплошной чат, проблемы с конфиденциальностью !! - person anshulkatta; 25.05.2021