我们计划使用 Amazon OpsWork 部署网络应用程序,我只是想与您核实一下我们的架构是否存在任何设计缺陷。
我们有 4 个组件:
- 负载均衡器(最好是 Amazon)
- 基于 Node.js 的 Express
- MongoDB
- Elasticsearch
这是我们组件的通信图:
前端是一个负载均衡器,它将 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/