在节点群集上运行多个Node应用程序

时间:2013-10-10 17:41:15

标签: node.js express node-http-proxy

我们需要在一组服务器上部署多个Node / Express应用程序(在负载均衡器后面)。这些应用程序在功能方面完全相互独立。我将首先解释我是如何考虑这样做的,然后我在最佳实践方面寻找输入,如果我的设计中有任何危险信号等。

以下是我正在考虑的设置:

负载均衡器后面的前端服务器将运行node-http-proxy,它将接受端口80上的传入请求。此反向代理将请求路由到此服务器上不同端口上运行的相应节点应用程序。例如:

var http = require('http'),
    httpProxy = require('http-proxy');

var options = {
  router: {
    'myapphost.com/MyFirstApp': 'myapphost.com:3000',
    'myapphost.com/MySecondApp': 'myapphost.com:3001'
  }
}

// ...and then pass them in when you create your proxy.
var proxyServer = httpProxy.createServer(options).listen(80);

每个节点应用程序都将使用Cluster2之类的东西在节点集群上运行,以利用多核系统。

我的问题:

  • 这是正确的设计和策略吗?
  • 我们的一些应用程序需要是有状态的。在这种设置中进行状态管理的最佳方法是什么?使用Redis等外部会话存储是正确的方法吗?或者将会话固定到给定的前端机器并使用内存会话存储?

更新

自从我发布这个问题以来,在与几个人交谈之后,又出现了一种方法 -

我可以在我的前端机器前使用Nginx作为反向代理和负载均衡器。每个前端机器只能提供一个应用程序。该应用可以有一台备份机器。 (取决于要求)。所以,如果我有三个应用程序,我将有三台独立的机器,每台机器服务于不同的应用程序。所有请求都将由Nginx在端口80上接收,Nginx反向代理将请求路由到正确的前端机器。每台机器都将拥有Node集群,以利用多核系统。这种方法的优点是 - 每个应用程序的部署变得更加容易。此外,我们可以单独扩展每个应用程序。

请分享您对此方法的看法。

1 个答案:

答案 0 :(得分:0)

这是一种正确的方法,您也提到了redis,或者您可以使用任何其他会话存储,例如connect-mongo或任何其他会话存储。
如果您正在使用Load Balancer,我猜您有多个相同服务器的实例?如果是这种情况,那么您需要分析会话性能及其使用量,然后决定是否需要对会话存储/数据库进行分片,或者每个平衡实例将与之通信的单个机器。

你已经想到了正确的方法,为什么不尝试和破解其中的一些,看看它是否符合你的需求?

您还需要考虑静态媒体,可能需要单独存储(S3 + CloudFront?) 以及如何在保持应用程序逻辑一致性的同时为实例提供更新并重新启动它们。

此结构也可以进行AB测试(您可以使用应用程序的“测试版本”对特定实例进行负载平衡。虽然大部分将在主要实例之间进行平衡。

这一切都取决于你的规模,有时你最初并不需要那么多,只是准备好在未来进行改进和扩展。