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

我们需要在一组服务器(负载均衡器后面)上部署多个Node / Express应用程序。 这些应用程序在function上完全相互独立。 我将首先解释我是如何考虑这样做的,然后根据最佳实践寻找意见,如果我的devise中有任何红旗。

这是我正在考虑的设置:

负载平衡器后面的前端服务器将运行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的节点群集运行,以利用多核系统。

我的问题:

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

更新:

既然我发表了这个问题,在和几个人交谈之后,还有一个方法来了 –

我可以使用Nginx作为我的前端机器前面的反向代理和负载均衡器。 每个前端机器将只提供一个应用程序。 该应用程序可以有一个备份机器。 (根据要求)。 所以,如果我有三个应用程序,我会有三个独立的机器,每一个都提供不同的应用程序 Nginx会在端口80上接收所有请求,Nginx反向代理会将请求路由到右前端机器。 每台机器都有节点群集,以利用多核系统。 这种方法的优点是 – 每个应用程序的部署变得更加容易。 另外,我们可以分别缩放每个应用程序。

请分享您对这种方法的看法。

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

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

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

这种结构也使ABtesting成为可能(你可以使用应用程序的“testing版本”对特定的实例进行负载平衡,而大部分将在主要实例之间进行平衡。

这一切都取决于你的规模,有时你真的不需要那么多,只是准备在未来的改善和规模。