Стратегия распределения нагрузки между клиентом и сервером

Примечание

Этот материал находится в состоянии наполнения информацией.

У нас на Godot запланировано не только Клиентское приложение, но и Серверное приложение, но про сервер тут вопрос интересный, нужно подумать над нашей стратегией по распределению нагрузки и безопасности, и следовательно над архитектурой, которая вытекает из этой стратегии.

1. Чем больше работы происходит на стороне Клиентского приложения, тем меньше нагрузка на серверную часть. Тут я говорю про всю серверную часть: и про Серверное приложение на Godot, и про Django-бэкенд. Тут конечно нужно учитывать, что чем больше идёт нагрузка на компьютер пользователя, тем выше будет минимальный порог для использования нашего Клиентского приложения Универсо, а значит и выше порог возможности подключения к Универсо. Но тут вопрос такой, что раз мы создаём приложение на игровом движке и в целом приходим в сферу игр / виртуальных пространств, нам просто нужно соответствовать актуальным требованиям к производительности компьютера пользователя, стараясь по возможности снижать минимальные требования, чтобы Клиентское приложение Универсо могло работать по возможности на большем количестве компьютеров.

Оптимизация производительности - это вопрос важный, но это вопрос постоянный, об этом просто нужно помнить, при этом нужно без остановки реализовывать наши планы по созданию Универсо. Тем более что по этим планам, будет возможность переключаться между различными графическими представлениями. Пользователи смогут включить даже интерфейсы в виде старой Элиты, где всё из чёрточек. Ну такое разнообразие интерфейсов, конечно, будет возможно, когда проект наберёт популярность в том числе и как опенсоурсный проект, чтобы больше количество людей хотели делать больше вариантов графического представления.

Сейчас для нас приоритет в том, чтобы это могло работать с нашими ограниченными ресурсами, в том числе на поддержание серверов. Так же, раз у нас есть планы всё-таки добиться через некоторое время взрывного роста количества пользователей Универсо, нужно понимать, что увеличение количества пользователей не будет сразу пропорционально увеличивать появление у нас ресурсов, в том числе финансовых на поддержание серверов. Тем более в текущем мире с падающей экономикой, сейчас у людей всё меньше свободных финансовых ресурсов. Кроме того, мы не сможем сразу максимально эффективно противостоять нашествию ботоводства, когда некоторые пользователи захотят сделать множество аккаунтов.

Поэтому больше всего функционал / работы наращиваем на стороне Клиентского приложения на Godot, в том числе, сделаем там локальную SQLite базу, которая будет с некоторой периодичностью синхронизироваться с главной базой и в ней будет кэшировано много различной информации, чтобы было меньше запросов через АПИ к Джанго-бэкенду.

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

Исходя из этого, думаю наш подход должен быть таким, что пользователь может у себя в Клиентском приложении сделать что угодно, но чтобы это «что угодно» не выходило за пределы его Клиентского приложения, чтобы любые изменённые запросы, которые могут повлиять виртуальный мир, на других пользователей, чтобы любые накрутки не принимала серверная сторона.

3. В рамках наших планируемых сценариев использования Универсо пользователями, предполагается, что после отключения пользователя, закрытия им Клиентского приложения, продолжается различная активность в автоматическом режиме. В этом случае тоже нужно исходить из архитектуры, которая позволит нам минимизировать нагрузку на серверную часть. Ну то есть, можно конечно такую деятельность крутить на стороне Серверного приложения на Godot, но это будет съедать ресурсы и съедать всё больше. Важно ещё помнить, что у нас ведётся деятельность одновременно в двух параллельных мирах, коммунистическом и капиталистическом, и когда пользователь что-то делает в одном из параллельных миров, то во втором автоматически создаётся результат сопоставимый в размерах с тем, который пользователь сделал в ручном режиме. Это конечно тоже можно было бы запускать как дополнительные процессы на стороне Серверного приложения на Godot, но это ещё больше будет нагружать сервер.

По всей видимости нам нужно постараться реализовать большую часть автоматизации, таким образом, чтобы каждое действие не крутилось в постоянном процессе, а чтобы были разовые расчёты результата по заложенным алгоритмам. Ну то есть, если говорить об автоматическом создании результата в другом параллельном мире, когда пользователь переключился на него, тогда и случилось вычисление результата исходя из различных параметров. А в некоторых случаях может и предварительные расчёты, например, в прокачке какого-то навыка, сразу при запуске изучения рассчитывается дата / время когда у пользователя он станет активным, и в момент наступления он активизируется. В общем не нужно крутить лишние постоянные процессы на серверной стороне.

4. Ещё важно заметить, что говорят про Godot-сервер, что он довольно дубовый. Ну в целом, похоже так и есть, там нет всех этих фишек с перераспределением нагрузки, поддержки кластеров, обработки ошибок и всё такое. Нужно его использовать в минимальной мере, в рамках общей серверной связки, например только как исполнитель редких серверных скриптов на GDScript.

5. Ну и пару слов про мотивацию в использовании Серверного приложения на Godot. Поскольку программирование и Клиентского приложения, и Серверного приложения - это значительно повышение трудозатрат, некоторые текущие активные участники избегают даже разворачивание у себя локального Серверного приложения, тем более что не у всех есть Linux, а Godot-сервер сейчас есть только для Linux. В Godot 4 там вроде можно будет любое приложение Godot как безголовое на любой ОС запускать, ну или как-то так. Но это ещё не понятно как будет работать и это будет потом. В общем сейчас у некоторых наиболее активных участников мало мотивации работать ещё и с Серверным приложением на Godot.

Если резюмировать. Нужно смотреть, как минимизировать использование Серверного приложения на Godot. По крайней мере на текущий момент развития.