Использовать комнаты в socket.io или перебирать подключенных пользователей? - PullRequest
0 голосов
/ 11 апреля 2020

Я разрабатываю приложение для чата, позволяющее вести индивидуальные и групповые беседы. Все идет хорошо, за исключением того, что я застрял в ситуации, когда мне нужен совет. Вот мои настройки:

Я использую node.js в качестве внутреннего сервера, разрабатываю в Swift для iOS и использую MongoDB для хранения всего. Я использую socket.io для обеспечения связи в реальном времени.

Теперь мне интересно, каков наилучший подход для следующей ситуации. Я хочу, чтобы при получении сообщения другие пользователи получали уведомления в режиме реального времени, если они находятся в приложении (с помощью тоста сверху или, если они находятся в разговоре, путем добавления сообщения в историю чата ), но когда они не используют приложение, я хочу отправить уведомление pu sh. Think Messenger, WhatsApp, ...

По моему мнению, у меня есть два варианта, и я не могу решить, какой из них будет лучшим, простым в управлении и наиболее эффективным:

Решение 1

В этом сценарии я, получив новое сообщение (через конечную точку node.js), нашел бы соответствующий диалог из MongoDB на основе chat_id. Оттуда я бы получил список всех идентификаторов пользователей, которые участвуют в этом разговоре (два идентификатора пользователя означают чат один на один, а другие - групповой чат). Затем я мог бы проверить для каждого userID, подключены ли они в данный момент, потому что я сохраняю активные соединения при подключении и удаляю их при отключении. Если они подключены, я отправлю им сообщение, если они не подключены, я отправлю уведомление pu sh.

Преимущество этого состоит в том, что я могу отправить сообщение или уведомление pu sh довольно легко. Недостатком было бы то, что мне нужно было бы перебирать всех пользователей в беседе для каждого сообщения, например, если я отправляю 100 сообщений за 5 минут группе из 50 человек, мне нужно будет найти пользователей 100 раз на основе chat_id. и отдельно отправлять / отправлять pu sh уведомление об этих 100 сообщениях 50 людям.

Решение 2

В этом сценарии я использовал бы комнаты, которые в Мое мнение специально разработано для этого. Я бы создал комнату для каждого разговора и назвал бы ее так же, как и в моей базе данных MongoDB, на основе journal_id (например, 5e839693e0347bf2815be559). Затем, при получении сообщения, я просто отправлял сообщение в соответствующую комнату, что означало бы, что я должен отправить его только один раз. Для этого при подключении я должен был бы подписаться (присоединиться) ко всем комнатам / разговорам, частью которых я являюсь. Это может означать, что мне придется присоединяться к 100, 200 или более комнатам каждый раз, когда я открываю приложение, и оставлять их каждый раз, когда я закрываю приложение. Это также означало бы, что в конце концов я должен был бы получить участников, которые являются частью разговора, потому что мне нужно было бы отправить тех, кто не подключен, уведомление pu sh.

Итак, мои вопросы:

  • Что будет лучше? Решение 1 или решение 2?
  • Является ли проблемой перебирать участников беседы для каждого полученного сообщения? Будет ли это означать много (ненужных) накладных расходов?
  • Как лучше всего справиться с разницей между излучением (подключенным пользователям) и отправкой уведомления pu sh (неподключенным пользователям)?
  • Есть ли проблема присоединяться ко многим комнатам каждый раз, когда я подключаюсь к розетке, и оставлять их каждый раз, когда я отключаюсь?

Любая помощь очень ценится. Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...