Я разрабатываю высоконагруженный проект, который использует WebSocket протокол для двухсторонной связи между браузерам и сервером. Каждую секунду сервер получает тысячи данных от одних клиентов, обрабатывает, и отправляет похожие данные другим клиентам. В данном случае очень важен беспрерывная работа сервера, так как клиенты, которые получают данные, если хоть на несколько секунд перестанут получать их, то у них клиентская часть станет неправильно работать.
На данный момент у меня все отлично работает, когда я поднимаю только один экземпляр сервера. Но я хочу для всего этого ещё и настроить балансировщик.
Но если поднять два экземпляра, то каждый экземпляр может получать данные только от клиентов, которые подключены к нему. Тоже самое при отправке данных.
Как мне правильно написать вот эту часть сервера, чтобы все данные и соединения к серверу синхронизировались межу процессами?
P.S. Сервер написан на языке Python с использованием фреймворка TornadoWeb. Балансировщик планирую использовать Nginx, но если не годиться, то могу и другой.
UPD: Экземпляры должны бить подняты на разных физических серверах.
Можно сделать "по простому" что-б ноды перебрасывали данные друг-другу на стороне сервера, но если разброс связей большой и куча трафика пойдет между нодами, то толку от этого нет.
1) Поэтому лучше всех пользователей группировать по кучкам и эти группы общались только в пределах ноды.
2) Если отправитель знает кому посылает данные (например чат), то в объекте пользователя можно держать ид ноды на котором он сейчас хостится, тогда отправитель будет посылать данные прямо на тот сервер где хостится получатель.
3) так же как и 2. но может быть проще - делать группы/кабинеты как в чатах, и эти группы хостятся на определенных нодах через них и общаются пользователи.
Так же можно разгрузить ваш торнадо сервер, выкинуть из него все что не связанно с передачей данных, если есть какие-то расчеты и т.п. - на внешний обработчик.