Web 应用程序如何处理数以千计的请求?

net*_*rox 4 performance scalability web-applications

我访问了一些网站,注意到它们都使用 AJAX 技术来处理许多任务,例如聊天、消息等。他们显然使用了很多 httprequests。我的问题是,如果您使用 AJAX 构建一个简单的网站,并且您预计每小时只有几个人,然后您开始每小时有 1,000 名成员登录 - 如果您只是升级到更快的更大服务器,单个 Web 应用程序每小时可以处理更多请求或者你必须重写代码?您究竟如何“扩展”Web 应用程序?

McJ*_*eff 10

这是一个非常非常复杂的问题,许多聪明人会花大量时间思考。

也就是说,您可以引入一些久经考验的真正机制来帮助实现可扩展性。不过,最终归结为您的应用程序以及它应该如何具体扩展。例如,您扩展 Oracle 的方式与扩展 Apache 的方式不同。

首先,不要太担心可能发生的事情。太多的开发人员担心“也许”而不是“现在”。绝大多数应用程序和网站不需要任何与众不同的东西。

除了免责声明之外,在设计和编码高度可扩展的应用程序时,通常还应遵循一些原则。“无共享”的概念浮现在脑海中。关注点分离。优秀的开发人员认识到这一点,并且可以从一开始就以此为基础。

常用实现技术的列表:

  1. 缓存。实现前端层以防止图像和数据查询到达后端。同样在对象层通过类似 memcached 的东西。目标是尽量减少工作量并尽可能提前回复客户端。

  2. 数据存储分片。这使得数据层可以水平扩展,以便在达到容量时添加额外的数据库系统和服务器。通常有一个“分片键”或排序来指示给定数据在哪个数据库服务器上可用。这并不止于 RDBMS 层。还应该考虑文件存储等。

  3. 负载均衡。允许我们添加更多前端客户端(Web 服务器)来处理请求负载。这就是整个“无共享”方法的用武之地。这些 Web 服务器应该是无状态的,这样故障就无关紧要了。然后可以通过添加更多机器来水平扩展。由于我们的数据分布在后端层,因此它们只是插入并处理请求。平衡算法用于选择不忙的服务器。可以这么说,分散负载。

  4. CDN。这种建立在 #1 之上,但依赖于 CDN 提供商。我们再次建立在尽可能向前回答请求的概念上。甚至有一个完整的“Edge Side Includes”语言来管理这些东西。

  5. 数据复制。例如,复制到一对读取节点的单个写入节点。由于大多数 Web 应用程序都是读取愉快的,因此我们可以将读取定向到读取节点,同时通过写入节点泵送写入。MySQL、Postgres、Oracle、MSSQL 和最终一致的 NoSQL 选项(如 MongoDB)都支持这一点。这不一定与#2 相互排斥。

我确定我忘记了一些东西,因为我把所有这些都从记忆中拉出来了,但你明白了。从本质上讲,应用程序需要设计为可扩展的。如果你有这个,就可以通过部署智能架构来分散负载并无限增长。