node.js - 可扩展 Web 应用程序的服务器架构

标签 node.js mongodb amazon-web-services cloud elasticsearch

我们计划使用 Amazon OpsWork 部署网络应用程序,我只是想与您核实一下我们的架构是否存在任何设计缺陷。

我们有 4 个组件:

  1. 负载均衡器(最好是 Amazon)
  2. 基于 Node.js 的 Express
  3. MongoDB
  4. Elasticsearch

这是我们组件的通信图:

components communication diagram

前端是一个负载均衡器,它将 http 请求分发到多个 Web 服务器。

Web 服务器是无状态的,因此可以在每次负载需要时进行克隆。所有 Web 服务器实例都是平等的。 session 信息保存在 MongoDB 中。

在“后端”,我们计划使用 MongoDB 和 ElasticSearch 的内置集群功能。因此,每个 Web 服务器实例仅连接到单个 MongoDB 和 ElasticSearch 主实例。 MongoDB 和 ElasticSearch 然后相应地扩展。此外,ElasticSearch master 与 MongoDB master 对话以检索用于构建索引的数据。

在我们看来,设置此类系统最具挑战性的任务是使用 MongoDB 和 ElasticSearch 集群配置 OpsWorks。

非常感谢!

最佳答案

if our architecture might have any design flaws.

嗯,请记住,我们无法从通用图表中看出太多信息。但这里有一些注意事项:

1) MongoDB 不像其他数据库(例如 DynamoDB、Riak 或 Cassandra)那样易于扩展。例如,如果您超过了单个主服务器的容量(无论您有多少个从服务器,所有写入都会转到单个主服务器),您将不得不进行分片。但是切换到分片非常具有破坏性,而且设置起来非常繁琐。

如果您不希望超过一个 Node 的写入容量,那么您在 MongoDB 上就没问题。

2) 您将如何处理发送电子邮件、创建长报告等异步任务?

可以在请求循环中执行这些操作,这可能是开始的好方法。但是当你有更多的盒子时,失败的机会就会增加。当一个盒子死了,所有的异步任务都消失了,没有人会知道它们是什么。您还可能会遇到这样的问题,即一个机器负载大量异步任务(使用过多的 CPU 或内存),并且随着它获得更多任务并更缓慢地完成它们,问题会变得越来越严重。

此外,像 ELB 这样的前端将有 60 秒的限制,如果您的某些请求可能需要更长的时间,这可能会导致问题。 (通过轮询或其他方式将它们分离为异步作业。)

3) ELB 不支持网络套接字。考虑一下,如果您认为您可能想要 websockets。

关于node.js - 可扩展 Web 应用程序的服务器架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17362253/

相关文章:

javascript - 如何从 package.json 配置 uglifyjs

mongodb - 如何通过查询字符串 Restfully 实现连接

node.js - 尽管绑定(bind)了 ip,但在本地网络中无法访问 MongoDB 服务器

.net - 用于更新库存的亚马逊 MWS API

node.js - Mongodb - 映射关系 - 类型 Objectid

javascript - 如何使用 passport.js 的 passport-local 或其他 Node.js 工具获得完整的 CRUD?

node.js - Redis 上的 socket.io-emitter 每次发送数据都要初始化

mongodb - 如何获取子文档对象的计数 - mongoDB

amazon-web-services - Jenkins ECS 和 EFS 出错

python - AWS : boto3 get all instances of a load balancers