Сводка по приложению:
У меня есть многопользовательская игровая платформа, построенная на 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 ответ
Я думаю, что у вас самое большое узкое место (это также может быть проблема с кодом, но это может быть низко висящий плод, и в целом лучше всего проектировать для масштабирования) пытается запустить все на одном сервере (если я не понимаю правильно, но вот как это звучит
Все находится в одном локальном приложении node / nuxt
Исходя из этого предположения, каждое из ваших приложений должно быть размещено на собственном сервере, поэтому, например,
Примечание. Если вы не знакомы с управлением этими службами, я, вероятно, поищу решение с управляемым типом.
- Сервер Redis для кеширования X 1
- Сервер Mongo для БД X 1
DB и Redis обычно очень производительны, поэтому для запуска достаточно одного экземпляра, не говоря уже о том, что кластер не понадобится, но прямо сейчас все должно быть в порядке
Теперь для стека приложений вы захотите разделить каждое приложение на его собственный сервер. Это означает, что
- Игра (экспресс)
- Socket.IO
- Остальное 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 для вашего приложения)
Похожие вопросы
Новые вопросы
express
Express - это минималистичная и гибкая платформа веб-приложений Node.js, обеспечивающая надежный набор функций для создания веб-приложений.