У меня есть сервер приложений. На высоком уровне этот сервер приложений имеет пользователей и группы. Пользователи являются частью одной или нескольких групп, и сервер информирует всех пользователей о состоянии их групп и других пользователей в их группах. Есть три основные функции:
- Обновление и широковещательная рассылка метаданных, относящихся к пользователям и их группам; например, пользователь входит в систему, и сервер обновляет статус этого пользователя и передает его всем онлайн-пользователям в группах этого пользователя.
- Действовать как прокси между двумя или более пользователями; клиент использует одноранговую передачу, но в случае, если два пользователя не могут напрямую подключиться друг к другу, сервер будет действовать как прокси между ними.
- Хранение данных для офлайн-пользователей. Если клиенту нужно отправить какие-то данные пользователю, который не в сети, сервер сохранит эти данные в течение определенного периода времени, а затем отправит их, когда пользователь придет в следующий раз. онлайн.
Я пытаюсь изменить это приложение, чтобы его можно было распространять на несколько серверов, не обязательно все в одной локальной сети. Однако у меня есть требование, чтобы обратная совместимость со старыми клиентами не могла быть нарушена; по сути, распространение должно быть прозрачным для клиента.
Самая большая проблема, с которой я столкнулся, — это обработка случая, когда пользователь, подключенный к серверу A, делает обновление, которое необходимо передать пользователю на сервере B.
Более того, еще более серьезная проблема возникает, когда пользователю Сервера А требуется, чтобы сервер выступал в качестве прокси-сервера между ним и пользователем Сервера Б.
Моя первоначальная идея заключалась в том, чтобы попытаться назначить каждому пользователю предпочтительный сервер, используя некоторый алгоритм, который учитывает, с какими пользователями им нужно общаться. Это может уменьшить количество пользователей, которым может понадобиться общаться с пользователями на других серверах.
Однако это только сводит к минимуму частоту общения пользователей на разных серверах. У меня все еще есть проблема с общением между пользователями на разных серверах.
Единственное решение, которое я мог придумать для этого, — это подключение серверов друг к другу, когда им нужно иметь дело с пользователем, подключенным к другому серверу.
Например, если я подключен к серверу A и мне нужен прокси-сервер с другим пользователем, подключенным к серверу B, я бы попросил сервер A для прокси-подключения к этому пользователю. Сервер А увидит, что другой пользователь подключен к Серверу Б, поэтому установит "релейное" соединение с Сервером Б. Это соединение будет просто пересылать мои запросы на сервер B, а ответы — мне.
Проблема в том, что это увеличит использование пропускной способности, которая и без того чрезвычайно высока. К сожалению, другого выхода я не вижу.
Есть ли какие-либо известные или лучшие решения этой проблемы? Не похоже, что для распределенной системы очень часто требуется связь между пользователями на разных серверах.