Как спроектировать систему чата таким образом, чтобы сеть не перегружалась из-за вещания? - PullRequest
0 голосов
/ 04 апреля 2020

Создание приложения для живого чата.

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

Давайте определим возможные состояния:

  1. пользователь A и пользователь B на одних и тех же серверах
  2. пользователь A и пользователь B находятся на разных серверах.
  3. пользователь A подключен, а пользователь B отключен.

Мое решение:

  1. Пользователь A отправляет сообщение в пользовательском интерфейсе
  2. При использовании веб-сокета сообщение поступает на сервер
  3. Сервер записывает сообщение в DB
  4. Сервер просматривает подключенных пользователей и не находит его

Теперь вот где все становится интересным / сложным ...

Стратегия 1:

  1. Сервер подключен к pubsub
  2. Сервер объявляет, что есть сообщение для пользователя B
  3. Другие серверы получают сообщение, видят, есть ли у них пользователь, и отправляют его их.

Проблема: представьте, что в чате 1 миллион пользователей, каждый пользователь Если нажать Enter, сотни серверов будут искать в своем списке пользователей этого пользователя.

Стратегия 2:

  1. Существует таблица, в которой хранится информация о том, на каком сервере был задан данный сервер. user.
  2. Сервер выбирает эту таблицу, а затем отправляет сообщение pubsub только на этот сервер. Каждый сервер будет подписываться на свой собственный канал, на котором любой другой сервер может публиковать sh.
  3. . Когда он станет онлайн-сервером, он обновит глобальный реестр.

Проблема: Меня беспокоит, если этот реестр может стать узким местом, и если мне здесь не хватает легкого выигрыша.

Очевидно, что это не новая проблема, и многие ее уже решали, какое стандартное для отрасли решение для этого.

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