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

问题描述 投票:40回答:4

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

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

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

node.js http scalability
4个回答
34
投票

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

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

node-cluster

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

load balancers

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

这里有多种选择。以下是一些:

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

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


5
投票

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

  1. 我的应用程序需要在每个运行多个节点实例的分布式系统上可用
  2. 每个系统都应该有一个负载均衡器,可以帮助在整个节点实例之间分配流量。
  3. 应该有一个主负载均衡器,它应该在分布式系统上的节点实例之间分配流量。
  4. 主平衡器应始终运行或应具有可靠的重启机制以保持应用程序稳定。

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

  1. 使用cluster等模块启动系统中的多个节点实例。
  2. 始终使用nginx。它是迄今为止我遇到的最简单的创建负载均衡器的机制之一
  3. 使用HAProxy充当主负载均衡器。关于如何使用它并保持永久运行的few pointers

有用的资源:

  1. Horizontal scaling node.js and websockets.
  2. Using cluster to take advantages of multiple cores.

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


2
投票

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

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


1
投票

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

话虽如此,构建分布式应用程序很难,花时间学习,花费大量时间来掌握它,通常你会在性能,可靠性,manteinance等方面面临很多权衡。

© www.soinside.com 2019 - 2024. All rights reserved.