如何制作分布式node.js应用程序?

时间:2013-03-15 05:49:30

标签: node.js http scalability

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

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

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

4 个答案:

答案 0 :(得分:34)

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

  1. 能够为每台服务器使用更多核心
  2. 能够扩展到超过一台服务器。
  3. 节点群集

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

    负载均衡器

    第二种选择是使用负载均衡器在多个工作者之间(在同一服务器上或服务器之间)分发请求。

    这里有多个选项。以下是一些:

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

    如果你使用cloudfoundry,heroku和其他服务,他们会为你设置,所以你只需要担心应用程序的逻辑(并使用服务来处理共享状态)

答案 1 :(得分:5)

我已经在节点上工作了很长一段时间,但最近有机会尝试扩展我的节点应用程序,并且已经研究了相同的主题已经有一段时间了,并且遇到了以下扩展的先决条件:

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

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

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

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

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

    1. 使用cluster之类的模块在系统中启动多个节点实例。

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

    3. 使用HAProxy充当主负载均衡器。关于如何使用它并使其永久运行的few pointers

    4. 有用的资源:

      1. Horizontal scaling node.js and websockets.
      2. Using cluster to take advantages of multiple cores.
      3. 随着我的进步,我会不断更新这个答案。

答案 2 :(得分:2)

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

具体来说,您可能需要查看Node Cluster模块。我对这个模块并没有很多经验,但是它应该允许你在一台共享同一端口的机器上生成应用程序的多个进程。也是节点,它仍然是实验性的,我不确定它会有多可靠。

答案 3 :(得分:1)

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

话虽如此,构建分布式应用程序很难,需要时间学习,需要很多的时间来掌握它,通常你会在性能,可靠性,manteinance之间进行大量的权衡,等