Сводка по приложению:

У меня есть многопользовательская игровая платформа, построенная на Nuxt.js с экспресс-сервером. Я использую MongoDB (Mongoose ORM), Socket.io и Redis (для кеширования).

Я использую REST API для доступа и изменения игровых и пользовательских данных, а также socketio для распространения обновлений среди подключенных пользователей для игр - например, когда пользователь взаимодействует с одной из игр, а другим подключенным пользователям необходимо видеть обновленное состояние. Я использую redis для кеширования дорогостоящих вычислений, таких как отображение 10 лучших лидеров, а затем постоянно обновляю кеш с помощью потоков изменений mongodb.

Нынешняя структура монолитная. Все размещено в одном автономном приложении node / nuxt.

Возникшие проблемы:

Во время небольшой беты у меня было около 30-50 пользователей. Примерно через 30 минут наблюдалось сильное отставание. События веб-сокетов иногда полностью пропускались сервером / клиентом, или для их получения клиентом требовалось более 10-15 секунд, а для выполнения определенных запросов на получение / отправку требовалось 10 секунд +.

У меня нет опыта масштабирования. Любая дополнительная информация будет очень полезна.

< Сильный > Запрос :

  • Каким будет эффективный способ масштабирования этого приложения. Нужно ли мне что-то менять в структуре, чтобы ее масштабировать? Нужно ли мне использовать определенные технологии, такие как докер, такие вещи, как балансировка нагрузки и т. Д.

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

TL; DR;

Приложение Nuxt.js с использованием: Express.js, Socket.io, Redis и MongoDB. Как я могу масштабировать это приложение и нагрузочный тест, чтобы я мог точно видеть, сколько пользователей может обрабатывать мое приложение, прежде чем мне понадобится добавить дополнительные ресурсы / экземпляры.

1
Lorza 10 Май 2021 в 16:00

1 ответ

Лучший ответ

Я думаю, что у вас самое большое узкое место (это также может быть проблема с кодом, но это может быть низко висящий плод, и в целом лучше всего проектировать для масштабирования) пытается запустить все на одном сервере (если я не понимаю правильно, но вот как это звучит

Все находится в одном локальном приложении node / nuxt

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

Примечание. Если вы не знакомы с управлением этими службами, я, вероятно, поищу решение с управляемым типом.

  1. Сервер Redis для кеширования X 1
  2. Сервер Mongo для БД X 1

DB и Redis обычно очень производительны, поэтому для запуска достаточно одного экземпляра, не говоря уже о том, что кластер не понадобится, но прямо сейчас все должно быть в порядке

Теперь для стека приложений вы захотите разделить каждое приложение на его собственный сервер. Это означает, что

  1. Игра (экспресс)
  2. Socket.IO
  3. Остальное API?

Все должны быть отдельными приложениями, каждое из которых может использовать весь ЦП без необходимости конкурировать с другими процессами.

В вашем сообщении вы упомянули, что все начало замедляться и отставать, это может быть просто резервное копирование цикла событий, Node (однопоточный) будет обрабатывать в порядке запроса, поэтому, если он продолжает заполняться, процесс займет больше времени.

Вы упомянули, как бы вы это сделали, и это большой вопрос, и в зависимости от того, кого вы спросите, вы получите разные ответы, и «правильное» решение будет зависеть от того, насколько вы хотите управлять и насколько вам комфортно. есть с каждой технологией. Например, вы упомянули контейнеры ... Контейнеры - это здорово! но если вы не знакомы с Docker и Kuberneties и концепциями в целом, это может быть проблемой, а если вы работаете в одном магазине, то это еще больше работы ...

Итак, я уверен, что стоимость является важным фактором, потому что, ну, это всегда так, но, к счастью, это не слишком дорого для начала.

Лично я использую несколько серверов и сервисов от AWS, Linode и Digital Ocean (100,00 бесплатного кредита), мне нравится Digital Ocean (хотя некоторые из них не работают, у меня не было проблем с ними, поэтому я расскажу об их использовании)

Теперь, приступая к работе, вы всегда можете развернуть несколько капель и использовать PM2, чтобы в полной мере использовать каждый процессор для каждого приложения, это работает, но вам все равно нужно добавить балансировщик нагрузки и т. Д., А для горизонтального масштабирования вам необходимо подготовить новые серверы , настройте и добавьте их в кластеры, опять же, это будет работать, но это еще не все.

Digital Ocean предлагает сервисный вызов «Приложения», который, по сути, является предложением CAAS, который позволяет развертывать из GIT в контейнер, позволяя очень быстро горизонтально масштабироваться, я использую эту услугу для своих сервисов socket.io .. Когда я знаю, что у меня будет большая нагрузка, я просто добавляю еще несколько «приложений» на свой сокет-сервер и масштабируюсь с 2 до 6 серверов за несколько минут, а когда меня нет, я уменьшаю его ..

Итак, мой TL; DR: разбейте все на части, вы не хотите, чтобы приложения конкурировали за ресурсы.

*** Редактировать ***

Просто чтобы добавить к этому, как упоминал @kissu, вы наверняка можете использовать Heroku, очень похожий на DO Apps, однако (мой личный опыт здесь) они могут быть немного дороже, но с автоматическим масштабированием (DO Apps не предлагает этого). Что касается меня, я знаю, когда у меня будут всплески, поэтому мне легко планировать, но с автоматическим масштабированием игры может быть что-то, на что стоит обратить внимание или подумать. В этом случае Heroku OR AWS может работать лучше (AWS с группами Auto Scale с настраиваемыми AMI для вашего приложения)

3
proxim0 11 Май 2021 в 23:23