Распределённая система: как разрешить единственное подключение пользователя?
Игра работает на нескольких одинаковых серверах бэкенд. Пользователь подключается по WebSocket через Load Balancer на один из них.
Как отключить предыдущие сеансы пользователя при новом его подключении?
Предыдущий может быть на другом бэке, чем обрабатывающий новый коннект. Центральной базы нет, все узлы одинаковы. Обмениваются только в конце игры итогами. У каждого Бэка есть список всех бэков и своё место в нём.
Мысль пока только добавить команду-ответ: при новом соединении опрашивать остальные бэки: «пришёл {userid=XXX, timestamp=YYY, back=ZZ}, если у вас есть такой, более давнего подключения, отключайте».
Какие ещё есть варианты без центрального/общего хранилища?
Можно рубить на уровне балансировщика, если он у вас один На основе чего сделан балансировщик и какая схема подключения?
Написано
Сергей Соколов
@sergiks Автор вопроса, куратор тега Алгоритмы
Илья, HAProxy. Устанавливается единственное WS соединение. Сообщением приходит логин по токену.
И задача не запрещать новые, а отключать старые, вернее, ставить их в read-only, отправив сообщение.
Всё на уровне приложения.
Сергей Соколов, про HAProxy ничего не знаю.
Идея про отправку на все бэки мне не кажется надежной, потому что для организации нового подключения нужно чтобы обязательно все бэки были на связи и обработали это сообщение. А если не гарантировать это, то есть шанс кого-то недоотключить.
Хотя возможно если брать модель акторов, то там есть какие-то идеи насчет этого, но это не точно, сам я её не применял нигде.