Основы
В настоящее время некоторые из моих друзей и я пытаемся разработать браузерную игру, сделанную в nodejs. Это многопользовательский шутер сверху вниз, и большая часть кода на стороне клиента и на стороне сервера находится в javascript. У нас есть хорошее общее направление, в которое мы хотели бы пойти, и нам очень интересно разрабатывать игру. Одна из наших целей при создании этой игры заключалась в том, чтобы сделать ее максимально возможной, чтобы обмануть. Делайте это, у нас есть вся логика игры, обработанная на стороне сервера. Клиент только отправляет свой вход на сервер через веб-сокет, а сервер обновляет клиент (также веб-сокет) тем, что происходит в игре. Вот начало нашей проблемы.
Вся математика на стороне сервера становится довольно массивной, и мы находим, что нам нужно каким-то образом масштабировать, чтобы обрабатывать больше, чем 10 игроков (мы хотим, чтобы иметь возможность принимать еще много). Сначала мы поняли, что можем просто масштабировать вертикально, как нам нужно, но поскольку nodejs является однопоточным, он может использовать только одно ядро. Это означает, что получение более жесткого сервера не поможет этой проблеме. Наше единственное решение - масштабировать по горизонтали.
Почему мы спрашиваем здесь
Мы не смогли найти хороших примеров того, как масштабировать игру nodejs. Наш прецедент довольно специфичен, и, хотя мы сделали все возможное, чтобы сделать это сами, мы могли бы извлечь выгоду из внешних мнений и советов.
Подробнее
Мы уже много размышляли над тем, как решить эту проблему. Мы работаем над этим более недели. Вот что мы собрали до сих пор:
Четыре типа серверов
Мы разбиваем задачи на 4 разных типа серверов. Каждый из них будет выполнять определенную задачу.
Прокси-сервер
Прокси-сервер будет сидеть в передней части всего стека и быть единственным сервером, напрямую доступным из Интернета (потенциально может быть и больше). На нем будет haproxy, и он будет маршрутизировать все подключения к веб-серверам. Мы выбрали haproxy из-за его богатого набора функций, надежности и почти непревзойденной скорости.
Веб-сервер
Веб-сервер получит веб-запросы и будет обслуживать все веб-страницы. Они также будут обрабатывать создание/управление лобби и создание/управление игрой. Чтобы сделать это, они расскажут игровым серверам, какие у него лобби, какие пользователи находятся в этом лобби, и информацию об игре, которую они будут играть. Затем веб-серверы обновили игровые серверы о вводе пользователя, а игровой сервер обновил веб-серверы (которые затем обновили бы клиентов) того, что происходит в игре. Веб-серверы будут использовать сокеты TCP для связи с игровыми серверами любого типа управления, и они будут использовать сокеты UDP при общении об обновлениях игр. Это все будет сделано с nodejs.
Игровой сервер
Игровой сервер будет обрабатывать все математические игры и переменные обновления об игре. Игровые серверы также общаются с серверами db для записи отличной статистики о игроках в игре. Это будет сделано с nodejs.
Сервер db
Сервер db будет размещать базу данных. Эта часть на самом деле оказалась самой простой, так как мы нашли rethinkdb самый крутой db. Эта шкала легко и, как ни странно, оказалась самой легкой частью масштабирования нашего приложения.
Некоторые другие сведения
Если у вас возникли проблемы с тем, чтобы получить голову вокруг всего нашего getup, посмотрите на это, это полуточная диаграмма того, как мы думаем, что будем масштабироваться.
Если вам просто интересно, или подумайте, что это может быть полезно посмотреть на нашу игру, в настоящее время он размещен в нем без масштабирования.
Некоторые вещи, которые мы не хотим
- Мы не хотим использовать кластерный модуль nodejs. Он нестабилен (здесь ), и он не масштабируется на других серверах, а только на других процессорах. Мы хотели бы просто сделать скачок для горизонтального масштабирования.
Наш вопрос, подведенный
Мы надеемся, что мы пойдем в правильном направлении, и мы сделали домашнее задание, но мы не уверены. Мы могли бы, конечно, взять несколько советов о том, как это сделать правильно.
Спасибо
Я понимаю, что это довольно длинный вопрос, и сделать хорошо продуманный ответ будет непростым, но я бы очень признателен.
Спасибо!!