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

创build一个node.js应用程序非常简单。

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

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

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

  1. 每个服务器能够使用更多的核心
  2. 能够扩展到超过一台服务器。

节点集群

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

负载均衡器

第二个select是使用负载平衡器,将请求分发给多个工作者(在同一台服务器上或跨服务器)。

在这里你有多个选项。 这里有几个:

  • 基于节点的选项: 使用http-proxy与node.js进行负载平衡
  • nginx: Node.js + Nginx – 现在是什么? (使用多个upstream服务器)
  • apache :(没有明确有用的链接,我可以使用,但一个有效的选项)

还有一件事,一旦你开始有多个进程服务请求,你不能再使用内存来存储状态,你需要额外的服务来存储共享状态,Redis( http://redis.io )是一个stream行的select,但是不是唯一的一个。

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

我一直在使用Node,但是最近有机会尝试扩展我的节点应用程序,并且一直在研究相同的主题,并且已经遇到了以下扩展的前提条件:

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

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

  3. 应该有一个主分布式负载平衡器,应该分布在分布式系统上的节点实例上。

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

对于上述必要条件,我遇到了以下几点:

  1. 使用像群集这样的模块来启动系统中的多个节点实例。

  2. 总是使用nginx。 这是创build负载均衡器的最简单的机制之一,目前我已经遇到

  3. 使用HAProxy作为主负载均衡器。 关于如何使用它并保持它永远运行的几点提示 。

有用的资源:

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

我会继续更新这个答案。

使用多台计算机的基本方法是将它们放在负载平衡器后面,并将所有stream量指向负载平衡器。 这样,有人去http://my_domain.com ,它会指向负载平衡器机器。 负载平衡器的唯一目的(反正这个例子,理论上可以做的更多)是将stream量委托给运行你应用程序的机器。 这意味着你可以有多less台机器运行你的应用程序,但是一台外部机器(在这种情况下是一个浏览器)可以进入负载平衡器地址并到达其中一台机器。 客户没有(也不必知道)哪台机器实际上处理了它的请求。 如果您使用的是AWS ,那么设置和pipe理这个很容易。 请注意,Pascal的答案在这里有更多关于你的select的细节。

特别是使用Node时,您可能需要查看Node Cluster模块。 我对这个模块没有太多的经验,但是它应该允许你在一台机器上产生多个应用程序,并且共享相同的端口。 还节点,它仍然是实验性的,我不知道它将是多么可靠。