2016-04-23 48 views
0

我们有一个运行在服务器上的节点应用程序,它受到很多打击,必须编译一个用于下载的zip文件。目前为止效果很好,但我很紧张,我们会遇到性能问题。 (应用程序目前正在与forever Ubuntu的14.04机器上运行。)Nodejs缩放和优化功能

我现在问到各种新的功能添加到应用程序,它是更次要的,应不降低主要功能的性能(zip下载)。如果这些附加功能失败了,那么应用程序被击中太多时间来支持主压缩过程就没有问题。

这里的最佳做法是什么。为次要功能创建REST API并将所有内容放入等待列表中?每当主压缩过程结束时,创建第二个应用程序并产生一个新进程肯定是不够的。我如何确保最多的冗余?我不是在谈论多核cluster设置或load-balancing on NGINX,而是一种在应用程序级别优先考虑应用程序功能的智能方式。

我希望这不是太宽泛。干杯

回答

1

首先,一切都应该使用异步I/O,在服务器的任何地方都没有同步I/O。这是构建可扩展node.js服务器的第一条规则。

其次,具有任何显着CPU使用率的最高优先级任务应允许使用多个内核。正如你所说,如果最高优先级的任务是创建zip下载,那么你应该确保该操作可以利用多个核心。

您可以使用集群(您的整个服务器运行多个实例,每个实例都可以位于单独的核心上)或创建一组专门用于创建zip文件的进程,然后在主进程中创建工作队列喂这些其他进程的工作,并从他们得到的结果。第二种选择可能比集群代码更复杂一些,但是它确实优先考虑了zip文件的创建,所以只有一个核心服务于其他服务器需求以及所有其他处理zip文件创建的核心。群集与所有服务器职责共享所有核心。

在纯粹的服务器应用程序级别,您的服务器可以维护所有即将进行的工作的工作队列,无论其类型如何,它都可以优先处理该工作。例如,如果有API调用进入,并且队列中已有N个zip文件请求,则可能会立即使API调用失败,以防止其在服务器上生成。我不认为我个人会推荐这种解决方案,除非你的API调用是非常繁重的操作,因为如果开发人员经常对它们失败,开发人员很难可靠地使用你的API。他们通常会发现API的速度有时比定期失败更好。

您甚至可能不需要使用队列,只需使用一个计数器来跟踪有多少ZIP文件请求正在“处理中”,但您必须确保计数器在所有内容中都是准确的案例。如果计数器中存在累积错误,那么您可能最终会在所有API请求失败之后才重新启动服务器。

+0

我喜欢你的计数提议。我想这就是我所指的。干杯 – Dominik