m_hamlet
@m_hamlet
Веб разработчик

Как сбалансировать WebSocket сервер?

Добрый день.

Я разрабатываю высоконагруженный проект, который использует WebSocket протокол для двухсторонной связи между браузерам и сервером. Каждую секунду сервер получает тысячи данных от одних клиентов, обрабатывает, и отправляет похожие данные другим клиентам. В данном случае очень важен беспрерывная работа сервера, так как клиенты, которые получают данные, если хоть на несколько секунд перестанут получать их, то у них клиентская часть станет неправильно работать.

На данный момент у меня все отлично работает, когда я поднимаю только один экземпляр сервера. Но я хочу для всего этого ещё и настроить балансировщик.

Но если поднять два экземпляра, то каждый экземпляр может получать данные только от клиентов, которые подключены к нему. Тоже самое при отправке данных.

Как мне правильно написать вот эту часть сервера, чтобы все данные и соединения к серверу синхронизировались межу процессами?

P.S. Сервер написан на языке Python с использованием фреймворка TornadoWeb. Балансировщик планирую использовать Nginx, но если не годиться, то могу и другой.

UPD: Экземпляры должны бить подняты на разных физических серверах.
  • Вопрос задан
  • 1679 просмотров
Пригласить эксперта
Ответы на вопрос 2
@lega
Можно сделать "по простому" что-б ноды перебрасывали данные друг-другу на стороне сервера, но если разброс связей большой и куча трафика пойдет между нодами, то толку от этого нет.

1) Поэтому лучше всех пользователей группировать по кучкам и эти группы общались только в пределах ноды.

2) Если отправитель знает кому посылает данные (например чат), то в объекте пользователя можно держать ид ноды на котором он сейчас хостится, тогда отправитель будет посылать данные прямо на тот сервер где хостится получатель.

3) так же как и 2. но может быть проще - делать группы/кабинеты как в чатах, и эти группы хостятся на определенных нодах через них и общаются пользователи.

Так же можно разгрузить ваш торнадо сервер, выкинуть из него все что не связанно с передачей данных, если есть какие-то расчеты и т.п. - на внешний обработчик.
Ответ написан
Комментировать
mututunus
@mututunus
Backend developer (Python, Golang)
Используйте какой-нибудь Pub/Sub сервер, например Redis.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы