我目前正在开发一个 Web 应用程序,并试图找出托管它的最佳方式。我环顾四周,使用了几十种不同的措辞,阅读了数百条帖子和评论。但似乎没有一个能回答这个问题的这个特定方面。他们解释了如何计算应用程序的特定实例可以处理的当前用户数量。但没有解释如何确定从那里去哪里实现你的目标。我研究过云,研究过 VPS,当然也考虑过专用的,它们都有不同的价格,但最后我意识到这一切都取决于你需要向哪个方向扩展(垂直方向,通过更多的 CPU 能力和更多的内存为应用程序的任何一个实例添加更多功能;或者水平方向,添加应用程序的新实例并对其进行负载扩展)
第1部分
现在让我们先来看一下一个小场景。假设您有一个 API 应用程序。它接受 HTTP 请求并以 JSON 响应,无论它是用 Node、Rails、PHP 还是其他任何语言构建的。假设您可以在高峰时段估算所有这些因素:并发用户:100 -> 1000 -> N 每个用户每分钟的请求数:1?10?50?平均每个请求传输的数据大小:1Kb?2KB?5KB?10?
您如何确定哪个方向最适合扩展?是这些因素的比例吗?这些因素中的一个是否达到某个程度,而您必须向另一个方向扩展才能处理它?
第2部分
这次让我们假设一种不同类型的应用程序。这次它是一个处理实时数据交换的 Web 套接字应用程序,如聊天或事件通知(从消息 Q 推送的事件,如 Redis 或 RabbitMQ)此应用程序(据我所知)的扩展方式与第 1 部分中的相同因素完全不同,您如何确定要走哪个方向?
全面的
我问这些问题是为了弄清楚哪种类型的托管最适合哪种应用程序。哪种托管能给我带来更高的稳定性?哪种托管能让我在拥有相同数量用户的情况下节省更多钱?
答案1
这个问题目前几乎不可能回答,因为它涉及的话题太广泛了。回答这个问题需要涉及整个工程领域,人们(包括我自己)都靠做全职工作谋生。恕我直言,它既是科学又是艺术,你会发现有很多书(我的同事说)都在讨论这个主题。
因此,我只能提供一些简短、大致的建议。
- 没有单一的公式可以确定最佳的扩展方向。如果多个应用程序捕获和预测的指标相同,则扩展它们的方式可能完全不同。这实际上完全取决于应用程序(错误)行为的瓶颈所在。
- 最好的方法是进行测试和测量。确保您的应用程序已安装,以便您可以用不同的负载测试应用程序并观察/测量对其所有资源(服务器、网络等)的影响。您还需要在向不同方向扩展时进行测试。
- 从经验来看,大多数 Web 应用扩展问题甚至无法(或不应该)通过投入更多硬件/资源来解决。更多时候,问题出在代码及其效率低下上(我将其归类为缺陷)
话虽如此,如果我要完成所有这些工作并需要选择一个托管解决方案,那么在产品供应和控制成本方面,灵活性和功能最强的解决方案是 Amazon Web Services (AWS)。这是我使用过的唯一一家接近大型企业数据中心并提供我所寻找的大部分功能的托管服务提供商。主要功能包括:
- 你可以使用他们的免费套餐,免费(或几乎免费)地在那里托管你的应用程序
- 只需单击几下并重新启动即可垂直扩展(在单个主机上增加 CPU 和内存)
- 当然,你可以使用更多服务器和其他相关服务(例如负载均衡器)进行水平扩展
- 除了虚拟机托管之外,他们还有许多其他服务(EC2 服务只是他们的服务之一)
我没有使用过其他 IaaS 提供商(Rackspace、Microsoft Azure 等),因此无法比较或对比它们。也许这会帮助你开始研究。
披露:在撰写此答案时,我并不持有任何亚马逊股票,也不为其工作=)