Я хочу масштабировать свой чат-сервер WebSockets по нескольким бэкэндам, и многочисленные решения и статьи в Интернете, похоже, рекомендуют (Redis) PubSub. Как я понимаю, типичный поток выглядит следующим образом:
- Пользователь отправляет POST-запрос со своим сообщением на подключенный сервер
- Сервер публикует это сообщение в канале наобщий экземпляр Redis
- Все серверы, которые подписаны на этот канал, уведомляются об этом сообщении
- Каждый уведомленный сервер проверяет хранилище данных Redis, для которого пользователи подключены к этому каналу
- Они получают это сообщение, а затем передают его всем подключенным клиентам, которыми они делятся, с результатами из шага 4
Однако, разве это не создает единую точку отказа и чрезмерно облагает налогом единственное Redisсервер? Похоже, что это по сути не масштабируемое решение.
Моя первая мысль, когда я столкнулся с этой проблемой, заключалась в том, чтобы иметь своего рода широковещательное решение. То есть что-то вроде этого:
- Пользователь отправляет POST-запрос со своим сообщением на свой подключенный сервер
- Этот сервер пересылает это сообщение всем остальным серверам на сервере
- Каждый сервер имеет хэш-карту от
channel name
до user list
- Сервер при получении сообщения проверяет, для какого канала он предназначен
- Затем сервер ищет, чтоchannel в его hashmap и перенаправляет его всем клиентам в этом списке пользователей
Похоже, что последнее решение выглядит более масштабируемым, так как не требует единой точки сообщения об ошибке шины. Похоже, что он также устойчив к отключению серверов, поскольку пользователь может просто повторно подключиться к любому другому произвольному серверу, получить последние сообщения из базы данных и снова начать прослушивание.
Однако я могудействительно ли что-нибудь узнаете о последнем решении в Интернете, кроме того, что я считаю, что оно называется решением для вещания и используется IRC, я полагаю?
Мне любопытно, почему все статьи рекомендуют паб/ Подрешение по сравнению с более широковещательным решением без сохранения состояния. Чего мне не хватает?