Подготовка к обновлению OrbitX v1.3 день 1: Проектирование

Всем добрый день/вечер/ночь

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

Самый главный и важный баг заключался в одном - Иногда при выборе большого количества спутников одновременно не все WebSocket открывают соединения из-за чего некоторые спутники могут не появиться/не отображать никакой информации.

В чем заключается проблема?

WebSocket'ы сервиса сейчас работают по принципу: 1 спутник = 1 WebSocket-соединение.

Если первый пользователь выбирает спутник - открывается WebSocket-соединение и создается Task.Run(), который каждую секунду транслирует в это соединение данные о спутнике на текущий момент. Если на этот спутник зашел второй пользователь - новый WebSocket не создается и никакой новый Task.Run() не создается, пользователя просто садят в уже соотвествующее спутнику соединение и они оба слушают оттуда данные о выбранном спутнике. Если пользователей на спутнике вдруг стало 0, то WebSocket-соединение и Task.Run() удаляются и очищаются.

Это хорошо работает, но только до тех пор пока не нужно запустить мультитрекинг спутников который я добавил в прошлых патчах. Когда пользователь выбирает отслеживания допустим 30 спутников одновременно, то открывается 30 WebSocket-соединений, это очень плохо, это большая сетевая нагрузка.

Почему это плохо?

Если второй пользователь зайдет и выберет те же 30 спутников, то количество соединений так же останется 30, но что если будет хотя бы 1 спутник который отличается? - Правильно - 31 открытое соединение, а если все 30 спутников будет отличаться? - Правильно - 60 открытых соединений, а если таких пользователей будет сотни? - Серверу будет очень плохо.

Решение проблемы?

Я думаю в сторону двух решений:

1. Мультиплексное динамическое соединение - вместо того, что бы для каждого спутника открывать отдельный WebSocket мы будем идти по схеме: 1 WebSocket = список из N-спутников. Пользователь будет выбирать допустим 15 спутников и будет открываться одно WebSocket соединениие в которое будет упаковываться массив/список/группы из 15 спутников и отправляться одним пакетом данных. В случае если пользователь решить добавить к этим 15 спутникам еще один, то WebSocket уже будет передавать массив/список/группы из 16 спутников, тем самым соединений на пользователя будет 1, а количество спутников будет тоже самое. 2. Мультиплексное статичное соединение - у нас на сервисе 41 категория спутников, можно создать 41 массив/список/группу по категорям. Когда пользователь будет подключаться к спутнику или добавлять новый, то код будет считывать к какой категории относится спутник и открывать ему одно из соединений в зависимости от категории спутника. Это позволит решить проблему сетевых соединений раз и навсегда потому что мы точно будем знать, что сколько бы не было пользователей - соединений всегда будет не больше 41. Но тогда возникнет другая проблема - это отправка огромного количества ненужных данных, ведь если пользователь выберет посмотреть всего лишь один спутник StarLink - он его посмотрит, но параллельно будут отправляться данные о всех 10.000+ спутников StarLink, пользователь всех их не увидит, а только один, но эти даннын будут грузить сервис когда они вообще не нужны.

На какой я стадии решения проблемы?

На данный момент я весь день составлял схему текущего состояния сети и API моего сервиса. Это было сделано, что бы не потерять в голове важные детали и понять в какую сторону двигаться. Прежде чем писать код - нужно сто раз визуализировать и спроектировать схему сервиса. Планируется еще 2 схемы - одна с вариантом "Мультиплексное динамическое соединение", а другая с вариантом "Мультиплексное статичное соединение", которые дадут мне понять, что лучше выбрать. Это нужно для того, что бы сэкономить недели пустого написания кода.

Ссылки:

Сервис: OrbitX Открытый исходный код: GitHub Ссылка на пост с последним обновлением: Пост

Всем спасибо за внимание, буду рад вашим идеям и предложениям. Схемы прикладываю :)

Подготовка к обновлению OrbitX v1.3 день 1: Проектирование | Сетка — социальная сеть от hh.ru Подготовка к обновлению OrbitX v1.3 день 1: Проектирование | Сетка — социальная сеть от hh.ru