Nodejs 缩放和优先级函数

Nodejs scaling and prioritising functions

我们在服务器上有一个节点应用程序 运行,它经常受到攻击,必须编译一个 zip 文件以供下载。到目前为止效果很好,但我很紧张我们会达到性能成为问题的地步。 (该应用程序当前在 ubuntu 14.04 机器上 运行 forever。)

我现在被要求向应用程序添加各种新功能,这些功能是次要的,不应降低主要功能(zip 下载)的性能。如果应用程序被点击太多次以支持主压缩过程,那么让这些附加功能失败是可以的。

此处的最佳做法是什么。为次要功能创建 REST API 并将所有内容放入等待列表?仅仅创建第二个应用程序并在每次主 zip 进程完成时生成一个新进程肯定是不够的?如何确保最大的冗余度?我不是在谈论多核 cluster setup or load-balancing on NGINX,而是在应用程序级别确定应用程序功能优先级的智能方式。

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

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

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

您可以通过集群(您的整个服务器运行多个实例,每个实例都可以在一个单独的核心上)或通过创建一组专门用于创建 zip 文件的进程然后在主服务器中创建一个工作队列来实现这一点为这些其他进程工作并从中获取结果的进程。第二个选项的代码可能比集群更复杂一些,但它确实优先考虑 zip 文件的创建,因此只有一个内核服务于其他服务器需求,而所有其他内核都在处理 zip 文件的创建。集群与所有服务器职责共享所有核心。

在纯服务器应用程序级别,您的服务器可以维护一个工作队列,其中包含所有要完成的传入工作,无论是哪种工作,并且可以优先处理该工作。例如,如果出现 API 调用并且队列中已经有 N 个 zip 文件请求,您可以立即使 API 调用失败以防止它在服务器上累积。我不认为我个人会推荐该解决方案,除非您的 API 调用确实是繁重的操作,因为开发人员很难可靠地使用您的 API 如果它经常失败。他们通常会发现 API 有时慢一点比经常失败更好。

您甚至可能不必使用队列,您可以只使用计数器来跟踪有多少 ZIP 文件请求 "in process",但您必须绝对确保计数器是准确的在所有情况下。如果计数器中曾经出现累积错误,那么您可能最终会失败所有 API 个请求,直到您的服务器重新启动。