Я пытаюсь разработать приложение для группового чата в реальном времени, специально предназначенное для больших групп (> 50 пользователей) в каждой комнате чата. Не все пользователи будут одновременно активно общаться в чате, но можно ожидать, что многие пользователи будут просто бездействовать / слушать и получать обновления, когда чаты входят в чаты.
Я разработал прототип, который не ориентирован на облачные вычисления, и нахожусь в процессе редизайна для облачной системы.
Я ожидаю, что у меня будет один сервер «перенаправления / балансировки нагрузки» (LBServer), который перенаправляет на ряд серверных «чатов» бэкэнда (CServers). Когда пользователь запрашивает присоединение к определенному чату от клиента, клиент подключится к LBServer, и LBServer ответит информацией о соединении для конкретного CServer, который поддерживает экземпляр чата в памяти. Затем клиент отключится от LBServer и подключится к CServer. Это соединение с CServer сохраняется до тех пор, пока пользователь остается в чате. CServer отвечает за обновление внутренней базы данных, которая регистрирует состояние чата, а также уведомляет других подключенных к нему клиентов об обновлениях в чате.
Вы уже можете предвидеть, если в одном чате существует слишком много пользователей (поэтому один CServer должен поддерживать постоянные соединения со всеми этими пользователями), что сценарий «горячей точки» развернется, если активность в комнате увеличится после порога обработки CServer. Скорость, чтобы идти в ногу со всеми обновлениями.
На данный момент я придумала одно наивное решение, чтобы моя система была еще масштабируемой. Я мог бы загрузить более крупный экземпляр CServer, скопировать состояние чата и попросить всех пользователей «горячего» CServer повторно подключиться к новому более крупному экземпляру. Я не верю, что это правильный способ справиться с масштабируемостью такой системы.
У меня есть несколько вопросов:
Учитывая, что я хотел бы видеть характер чата в реальном времени, есть ли более подходящий способ проектирования моей серверной системы, чтобы избежать необходимости сохранять соединения с одним экземпляром сервера?
Нужно ли мне вообще беспокоиться о том, чтобы обработка каждого чата происходила на одном сервере CServer, когда я уже отслеживаю состояние в базах данных? Я хочу оставить комнату открытой, чтобы пользователи могли одновременно участвовать в нескольких чатах. Если мы используем мою текущую модель, клиенту потребуется поддерживать несколько подключений к моему облаку (по одному для каждой комнаты чата, в которой находится пользователь). Это отстой для клиента. В качестве пересмотра я предполагаю, что клиенты будут поддерживать подключения к «универсальным» CServer, которые будут прослушивать изменения в чатах, в которых в данный момент находятся пользователи, и соответственно обновлять их.
Буду очень признателен за все отзывы и комментарии, и я был бы рад остановиться на чем-то непонятном. Спасибо.