Web 应用程序如何处理数千个请求?

Web 应用程序如何处理数千个请求?

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

答案1

这是一个非常非常复杂的问题,很多聪明人花了很多时间思考。

尽管如此,您可以引入一些经过验证的机制来帮助提高可扩展性。但最终还是要归结为您的应用程序以及具体如何扩展它。例如,您可以以不同于 Apache 的方式扩展 Oracle。

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

除了上述免责声明之外,在设计和编写高度可扩展的应用程序时,通常应该遵循一些原则。我想到的是“无共享”的概念。关注点分离。优秀的开发人员认识到这一点,并可以从第一天开始在此基础上进行构建。

常用技术列表:

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

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

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

  4. CDN。这种方法建立在 #1 的基础上,但依赖于 CDN 提供商。我们再次以尽可能提前响应请求的概念为基础。甚至还有一整套“Edge Side Includes”语言来管理这些内容。

  5. 数据复制。例如,单个写入节点复制到一对读取节点。由于大多数 Web 应用程序都以读取为主,我们可以将读取操作定向到读取节点,同时通过写入节点传输写入操作。MySQL、Postgres、Oracle、MSSQL 都支持此功能,MongoDB 等最终一致的 NoSQL 选项也支持此功能。这不一定与 #2 互斥。

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

相关内容