45

创建 node.js 应用程序非常简单。

var app = require('express')();
app.get('/',function(req,res){
    res.send("Hello world!");
});

但是假设人们对你的应用程序着迷Hello World!并耗尽了你的资源。如何在实践中扩大这个例子?我不明白,因为是的,您可以在不同的计算机上打开多个 node.js 实例 - 但是当有人访问http://your_site.com/时,它直接针对特定的机器、特定的端口、特定的节点进程。又怎样?

4

4 回答 4

38

有很多方法可以解决这个问题,但归结为两件事:

  1. 每台服务器能够使用更多内核
  2. 能够扩展到多于一台服务器。

节点集群

对于第一个选项,您可以使用与第二个node-cluster选项相同的解决方案。 node-cluster( http://nodejs.org/api/cluster.html ) 本质上是一种将节点进程分叉为一个主进程和多个工作进程的内置方式。通常,您需要 1 个 master 和 n-1 到 n 个 worker(n 是您的可用核心数)。

负载均衡器

第二种选择是使用负载均衡器,将请求分配给多个工作人员(在同一台服务器上,或跨服务器)。

在这里,您也有多种选择。这里有几个:

还有一件事,一旦你开始让多个进程为请求提供服务,你就不能再使用内存来存储状态,你需要一个额外的服务来存储共享状态,Redis ( http://redis.io ) 是一个流行的选择,但是通过no 意味着唯一的一个。

如果您使用 cloudfoundry、heroku 等服务,它们会为您设置好,因此您只需担心应用程序的逻辑(并使用服务来处理共享状态)

于 2013-03-15T06:36:19.407 回答
6

我使用 node 已经有一段时间了,但最近有机会尝试扩展我的 node 应用程序,并且已经研究了一段时间,并且已经遇到了以下扩展的先决条件:

  1. 我的应用程序需要在每个运行多个节点实例的分布式系统上可用

  2. 每个系统都应该有一个负载均衡器来帮助在节点实例之间分配流量。

  3. 应该有一个主负载均衡器,它应该在分布式系统上的节点实例之间分配流量。

  4. 主平衡器应始终运行或应具有可靠的重启机制以保持应用程序稳定。

对于上述要求,我遇到了以下情况:

  1. 使用集群等模块等模块在系统中启动多个节点实例。

  2. 始终使用 nginx。这是迄今为止我遇到的创建负载均衡器的最简单的机制之一

  3. 使用HAProxy充当主负载均衡器。几点建议关于如何使用它并使其永远运行

有用的资源:

  1. 水平缩放 node.js 和 websockets。
  2. 使用集群来利用多核。

随着我的进步,我会不断更新这个答案。

于 2015-04-02T18:07:10.740 回答
2

使用多台机器的基本方法是将它们放在负载均衡器后面,并将所有流量指向负载均衡器。这样,有人去http://my_domain.com,它会指向负载均衡器机器。负载均衡器的唯一目的(无论如何,对于这个例子;理论上可以做更多)是将流量委托给运行您的应用程序的给定机器。这意味着您可以有 x 台机器运行您的应用程序,但是外部机器(在本例中为浏览器)可以访问负载均衡器地址并访问其中之一。客户端不(也不必)知道实际上是哪台机器在处理它的请求。如果您使用的是AWS,设置和管理它非常容易。请注意,Pascal 的答案在此处提供了有关您的选项的更多详细信息。

特别是对于 Node,您可能需要查看Node Cluster模块。我对这个模块并没有太多经验,但是它应该允许您在一台机器上生成应用程序的多个进程,所有进程都共享同一个端口。还节点它仍然是实验性的,我不确定它有多可靠。

于 2013-03-15T06:36:41.300 回答
1

我建议看一下http://senecajs.org,这是一个 Node.js 的微服务工具包。对于初学者来说,这是一个很好的起点,可以开始思考“服务”而不是单一的应用程序。

话虽如此,构建分布式应用程序很困难,需要时间来学习,需要很多时间来掌握它,而且通常你会在性能、可靠性、维护等方面面临很多权衡。

于 2017-12-21T21:25:30.090 回答