2

我们需要在一组服务器(负载均衡器后面)上部署多个 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 集群以利用多核系统。这种方法的优点是 - 每个应用程序的部署变得更加容易。此外,我们可以单独扩展每个应用程序。

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

4

1 回答 1

0

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

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

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

这种结构也为 AB 测试提供了可能性(您可以使用应用程序的“测试版本”将负载平衡到特定实例。而大多数将在主实例之间平衡。

这也完全取决于您的规模,有时您最初真的不需要那么多,只需准备好在未来进行改进和扩展即可。

于 2013-10-15T09:49:46.383 回答