如何扩展和负载测试 nuxt.js 并表达应用程序?

How to scale and loadtest a nuxt.js and express application?

申请摘要:

我有一个基于 Nuxt.js 构建的多人游戏平台,带有快速后端。我正在使用 MongoDB(Mongoose ORM)、Socket.io 和 Redis(用于缓存)。

我正在使用 REST API 来访问和修改游戏和用户数据,并使用 socketio 将更新传播给已连接的游戏用户 - 例如当用户与其中一个游戏交互时,另一个已连接用户需要看到更新的状态。我正在使用 Redis 来缓存昂贵的计算,例如显示前 10 名排行榜,然后使用 mongodb 更改流不断更新缓存。

当前结构是单一的。所有内容都位于一个包含的 node/nuxt 应用程序中。

遇到的问题:

在小测试期间,我有大约 30-50 名用户涌入。大约 30 分钟后出现严重延迟。 Web 套接字事件有时会被 server/client 完全错过,或者它们需要超过 10-15 秒才能被客户端接收,而某些 get/post 请求需要 10 秒以上才能完成。

我有 0 次缩放经验。任何信息将不胜感激。

要求:

TLDR;

Nuxt.js 应用程序使用:Express.js、Socket.io、Redis 和 MongoDB。 我如何扩展此应用程序并进行负载测试,以便在我需要添加更多用户之前准确了解我的应用程序可以处理多少用户 resources/instances.

我认为你最大的瓶颈(这很可能也是一个代码问题,但这可能是容易实现的结果,并且通常最好针对规模进行设计)正在尝试 运行 同一台服务器上的所有内容(除非我没有理解正确,但听起来就是这样

Everything is sat on a single contained node/nuxt application

根据这个假设,您的每个应用程序都应该放在自己的服务器上,举个例子

注意:如果您不熟悉管理这些服务,那么我可能会寻找托管类型的解决方案

  1. 用于缓存 X 1 的 Redis 服务器
  2. Mongo DB X 1 的服务器

DB 和 Redis 通常性能非常好,所以单个实例应该可以启动,并不是说不需要集群,但现在你应该没问题

现在对于应用程序堆栈,您需要将每个应用程序分解到自己的服务器,这意味着

  1. 游戏(快递)
  2. Socket.IO
  3. 休息API?

都应该是单独的应用程序,每个应用程序都能够使用完整的 CPU,而不必与其他进程竞争。

在你 post 你提到事情开始变慢和滞后,这可能只是事件循环被备份,节点(单线程)将按照请求的顺序处理,所以如果它一直填满, 那么事情将需要更长的时间来处理。

现在,你提到了你将如何做到这一点,这是一个很大的问题,根据你问的人你会得到不同的答案,'right' 解决方案将取决于你有多少想要管理以及您对每种技术的适应程度。例如,您提到了容器。容器很棒!但是如果您不熟悉 Docker 和 Kuberneties 以及一般的概念,这可能是一个挑战,如果您是一个人的商店,那就更难了..

因此,我确信成本是一个因素,因为它总是如此,但幸运的是,开始时并不昂贵..

我个人使用来自 AWS、Linode 和 Digital Ocean 的多个服务器和服务(100.00 免费积分),我喜欢 Digital Ocean(尽管有些不喜欢,但我没有遇到过问题所以我会谈谈使用他们)

现在开始,您始终可以启动多个 'Droplets' 并使用 PM2 为每个应用程序充分利用每个 CPU,这可行,但您仍然需要添加负载均衡器等,并且要水平扩展,您需要提供新服务器,配置它们并将它们添加到集群中,这同样可行,但需要更多工作。

Digital Ocean 确实提供了一个服务调用 'Apps',它基本上是一个 CAAS 产品,允许您从 GIT 部署到一个容器,让您可以非常快速地横向扩展,我使用这个为我的 socket.io 服务提供服务。当我知道我的负载很重时,我只需向我的套接字服务器添加一些 'apps' 并在几分钟内从 2 台服务器扩展到 6 台服务器, 然后当我不在的时候我把它缩小..

所以我的 TLDR 是,将所有东西分开,你不想让应用程序竞争资源

*** 编辑 ***

补充一下,正如@kissu 提到的,您肯定可以使用 Heroku,它与 DO Apps 非常相似,但是(我个人的经验)它们可能会更贵一些,但具有自动缩放功能(DO Apps 可以不提供)。对我来说,我知道我什么时候会遇到高峰,所以我很容易计划,但游戏自动缩放可能是值得关注或考虑的事情。在这种情况下,Heroku 或 AWS 可能会更好地工作(AWS 与 Auto Scale 组和您的应用程序的自定义 AMI)