简单Node.js App的突然缩放

时间:2014-01-16 14:13:17

标签: node.js scalability

我的网站是用Node.js编写的,没有数据库或外部依赖,但确实有很多大型媒体文件(图像和一些视频)总共大约2GB。网站的结构来自几个简单的JSON文件。

我的问题是剧烈和突然的缩放。通常,任何小型VPS实例都可以轻松处理到我的站点的流量,但偶尔流量可以在短时间内达到正常水平的数百倍。我的问题是如何快速扩展,无需停机和自动扩展。我知道自动缩放存在问题,但是可能缺少数据库会否定其中一些。

我应该关注哪种缩放问题和选项?

(对于上下文,我目前正在使用Digital Ocean VPS,但我找不到一种简洁的方法来缩放它而不会停机。我不会与我的提供商结合。)

2 个答案:

答案 0 :(得分:3)

可伸缩性很重要,但在需要时进行扩展也很重要。我们都没有Facebook或Twitter的扩展需求:)这个可能只是一个资源管理案例。

测试问题

如果没有数据库并使用NodeJS,节点的一些优势就是它的并发连接数。对于简单的io加载,看起来你已经选择了一个很好的框架选择。而且,由于您的问题集是被轰炸的特定资源,因此请在您的服务器上运行一些负载测试。流行和免费的工具包括:

还有付费服务,例如NeoLoadLoadImpact(在小级别免费),预测网络,电子负载等。

根据这些结果,确定原因

是否正在提供服务的文件大小?它是并发请求的数量吗?在减速期间(ram,端口,文件系统,其他一些IO,CPU,带宽等),正在使用或最大限度地使用哪些资源?

查看this question,它定义了服务器负载的一些概念。要实施解决方案,您需要确定减速的原因。是这样的:1)有些队列填满了吗? 2)TCP连接和端口问题? 3)资源分配太慢?这将有助于塑造您的解决方案。

计划扩展。

项目所需的缩放类型可能只是另一个所需的部分。如果你知道这种情况下的根本原因,它会增加你的选择。

问题是带宽吗?也许使用您的Web服务器作为多个云文件服务实例的路由器可以有效地增加用户看到的带宽。即使只是将文件存储在更大的云上,也可以保证您可能需要的带宽。

问题CPU,RAM等?您可能需要同一Web应用程序的多个实例(或VFS的增加分配)。这是亚马逊弹性云计算(EC2)的“弹性”部分,以及其他类似的模型。当您看到交通开始尖峰时,创建一个“黄金图像”并复制,使用内置监控工具,在匆忙完成时将其关闭。可以是程序设计或只是手动。

问题是并发请求吗?瓶颈不应该是NodeJS,最多可达1000个并发请求。也许只需检查您的实现,以确保单节点线程没有减速。也许node clustering或某些worker threads可以为您的目的缓解瓶颈。

最后注意:对于提供静态文件,我听说nginx甚至Apache Tomcat比NodeJS更合适。根据您的Web应用程序的复杂性,您可以相当轻松地切换或进行基准测试。

答案 1 :(得分:0)

如果有人在几年后阅读这个相当具体的问题,我已经获得了一些观点。正如Clay所说,最终的答案是根据负载手动或以编程方式启动更多服务器。

然而,在我的情况下,这将是巨大的矫枉过正 - 我没有运行Twitter。问题是架构中的一个相对简单的错误。我的应用程序正在从每个页面请求的磁盘读取JSON数据文件,并且磁盘I / O已经饱和。我改为在启动时将数据文件加载到内存中,并在使用fs.watch()更改时重新加载它们。

我的谦虚VPS现在可以轻松处理之前崩溃的各种流量。我从来没有见过让我想要扩大规模的流量。