【问题标题】:Scale up a nodejs app on AWS在 AWS 上扩展 nodejs 应用程序
【发布时间】:2017-11-15 05:39:46
【问题描述】:

我在 AWS EC2 上运行了 nodejs 应用程序。

我想通过创建更多实例来扩展它。

我不太明白如何在网络方面做到这一点。

假设我创建了另一个实例,它正在侦听不同的端口。 我应该将客户端更改为从两个不同的端口请求吗?我相信这可能会导致数据库出现竞争状况

我是否想监听 EC2 机器上的一个端口并将请求定向到其中一个实例?在这种情况下,端口将一直忙,直到实例处理完请求,而不是与另一个实例并行处理请求

有没有人可以指点一下或者可以给我一些关于这个主题的文件?

【问题讨论】:

  • 您可以从解释您的 Node.js 应用程序的实际功能开始。什么是客户? HTTP 客户端?
  • 抱歉,这是一个 MERN 应用
  • 听起来您想使用带有粘性负载平衡器的 node.js 集群。

标签: node.js amazon-web-services amazon-ec2


【解决方案1】:

在基本级别,您将拥有多个 Node.js 应用程序实例,连接到一个公共数据库后端。 (您的数据库也应该是集群的,但这是另一篇文章的主题。)

如果您已经在遵循最佳做法,则一个请求将是一个响应,后续请求是否到达不同的应用程序服务器也没关系。也就是说,客户端可以随时击中其中任何一个,并且不会有任何副作用。如果没有,您将需要某种服务器固定(通常通过 cookie 或类似方法完成)以确保客户端始终位于同一应用程序服务器上。

最简单的负载平衡方法是让您的客户端连接到一个主机名,并且该主机名以循环方式解析到多个主机。这将分散流量,但不一定正确。例如,一个主机上的特定命令或问题可能意味着它只能处理 5 个请求,而其他服务器可以处理 5000 个。大多数云提供商都有负载平衡管理。 AWS 确实如此。

由于您已经在 AWS 上,我建议您通过 Elastic Beanstalk 部署您的应用程序。它按照配置自动启动/拆卸。您当然可以推出自己的解决方案,但使用已有的解决方案可能更容易。负载均衡器配置了 Beanstalk。

【讨论】:

  • 它们都连接到机器上运行的 MongoDB。我喜欢 cookie 的想法,所以您的意思是每个客户端都将由 cookie 中定义的一个特定服务器处理,对吗?我不太明白你说的几个主机名是什么意思?你的意思是多台 EC2 机器?
  • @EdgarBarber 您将运行一个数据库实例(或一个实例集群)并从您的应用服务器连接到它。
  • @EdgarBarber 我没有说几个主机名,我说的是几个主机名。那可能是一台 EC2 机器,是的。
  • 所以可以说我在我的 nodejs 实例上设置了 example.com/get_recipes 端点。正在从两个不同的客户端调用此端点。我想通过我的两台服务器并行处理请求。我不明白的是如何在第一个请求仍在处理时处理第二个请求?假设我使用flask编写了一个python服务器来对其进行负载平衡,我可以在第一个请求仍在由其中一个实例处理的情况下获得第二个请求吗?
  • @EdgarBarber 你可以用一个 Node.js 实例来做你的例子。不需要两个。 Node.js 可以并行处理请求。您的数据库也可以,因为您只是在获取数据。
猜你喜欢
  • 2015-05-23
  • 2015-12-04
  • 2021-08-07
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
相关资源
最近更新 更多