Создание приложения для живого чата.
Сервер может содержать ограниченное количество подключений к веб-сокетам. Так что должно быть много серверов. Поэтому, если один пользователь отправляет сообщение пользователю, который не подключен к тому же серверу, то сервер должен отправить его на сервер, к которому подключен другой пользователь.
Давайте определим возможные состояния:
- пользователь A и пользователь B на одних и тех же серверах
- пользователь A и пользователь B находятся на разных серверах.
- пользователь A подключен, а пользователь B отключен.
Мое решение:
- Пользователь A отправляет сообщение в пользовательском интерфейсе
- При использовании веб-сокета сообщение поступает на сервер
- Сервер записывает сообщение в DB
- Сервер просматривает подключенных пользователей и не находит его
Теперь вот где все становится интересным / сложным ...
Стратегия 1:
- Сервер подключен к pubsub
- Сервер объявляет, что есть сообщение для пользователя B
- Другие серверы получают сообщение, видят, есть ли у них пользователь, и отправляют его их.
Проблема: представьте, что в чате 1 миллион пользователей, каждый пользователь Если нажать Enter, сотни серверов будут искать в своем списке пользователей этого пользователя.
Стратегия 2:
- Существует таблица, в которой хранится информация о том, на каком сервере был задан данный сервер. user.
- Сервер выбирает эту таблицу, а затем отправляет сообщение pubsub только на этот сервер. Каждый сервер будет подписываться на свой собственный канал, на котором любой другой сервер может публиковать sh.
- . Когда он станет онлайн-сервером, он обновит глобальный реестр.
Проблема: Меня беспокоит, если этот реестр может стать узким местом, и если мне здесь не хватает легкого выигрыша.
Очевидно, что это не новая проблема, и многие ее уже решали, какое стандартное для отрасли решение для этого.