如何为你的Web项目构建高负载架构?
在规划 Web 产品开发时,选择合适的架构是一个至关重要的问题。首先,它应该具备可扩展性,能够处理高负载。尤其是在构建功能性网站、在线预订服务或电子商务解决方案时。
还记得人们如此喜爱的“黑色星期五”吗?你知道吗,有时网站和网络应用程序无法承受如此大量的用户涌入,从而损失惨重?
或许,您也曾因为需要等待漫长的等待才能加载网页,或者交易最终无法获得批准而感到恼火。最终,您决定不再与这家给您带来糟糕客户体验的公司合作。
缺乏高负载架构可能会导致页面加载缓慢、内容加载不全、崩溃、随机错误以及网络断开等问题。因此,构建一个能够处理高负载的软件系统至关重要。即使您的 Web 项目规模较小,在某些时候也可能会遇到用户激增的情况,或者您需要进行弹性扩展。
看一下有关高负载的一些事实:
- 当一台物理服务器无法有效地进行数据处理时,就会出现高负载
- 如果一个实例同时服务 10,000 个连接,则负载很高,高负载是指同时为数千甚至数百万用户提供服务
- 如果您在 AWS (Amazon Web Services)、Microsoft Azure或 Google Cloud Platform上部署 Web 解决方案,那么您将维护高负载架构
如果您的 Web 解决方案无法承受高负载,您可能会面临以下问题:
- 页面加载缓慢或无休止
- 随机误差
- 与 Web 服务器的连接已断开
- 部分内容加载
- 用户受众活动减少
- 客户损失
正如您所见,项目架构影响着其成功。没有满意的客户,就没有成功和利润。要实现可扩展的 Web 应用程序,您需要了解开发高性能软件解决方案的原则。
构建高性能解决方案的原则
动态性和灵活性
你永远不知道你的项目明天会发生什么。或者,一些不起眼的产品功能会在意想不到的时候开始流行起来。
或者您可能需要添加各种功能。又或者您决定推广您的应用程序并吸引客户。因此,您必须能够弹性扩展并处理高负载。
在开发大型 Web 解决方案时,务必注重灵活性,因为它能让您轻松进行更改和扩展。灵活性,即无需事先规划所有方面,是任何快速发展的软件系统最重要的特性。
项目逐步发展
未来几年的受众规模很难预测,所以最好专注于可扩展性。应用程序架构也是如此。循序渐进的解决方案是成功软件工程的基础。
如果您正在运行一款新产品,那么立即提供能够承受数百万用户并同时处理他们的多个请求的基础设施是没有意义的。
使用云来托管新项目,因为它可以降低服务器成本、方便管理并轻松部署应用程序。
此外,许多云托管服务提供私有网络服务,使软件开发人员能够安全地使用云中的服务器并使系统扩展。
Web 解决方案的扩展是一个渐进的过程,主要包含 4 个步骤:
- 负载分析
- 确定受载荷影响最大的区域
- 将这些区域转移到各个节点并进行优化
- 负载分析
可扩展的 Web 项目架构的开发
大多数情况下,新的软件解决方案会在单台服务器上运行,包括 Web 服务器、数据库以及解决方案本身。您无需从一开始就构建一个庞大复杂的项目。相反,您需要关注产品的可扩展性,并选择能够在必要时处理高负载的强大服务器。
这种方法将帮助您节省时间并降低开发成本。下面,您可以看到一些帮助您构建高性能可扩展 Web 应用程序的方法。
数据库分离
通常情况下,第一个负载的节点是数据库。用户向应用程序发出的每个请求通常包含 10 到 100 个数据库查询。将数据库分支部署到单独的服务器上可以提高其性能,并减少对其他组件(PHP、Nginx等)的负面影响。
数据库迁移
在某些情况下,将数据库迁移到其他服务器可能会给正在运行的 Web 解决方案带来麻烦。为了有效地迁移数据库,您应该执行以下操作:
-
使用一个简单的解决方案——在网站上发布关于计划工作的公告并进行转移。最好在晚上进行,因为那时用户活动最少。
-
使用复制功能将数据从一台服务器同步到另一台服务器。配置完成后,您需要将应用程序中的数据库 IP 地址更改为新服务器。然后,关闭旧服务器。
分离 Web 服务器
此后,将 Web 服务器分离出来,将其分配到单独的节点,以便为应用程序留出更多资源。以 PHP 为例,您应该将产品部署配置到 Nginx 服务器和 PHP 服务器(代表后端)。
然后,Nginx 本身将提供静态文件,而 PHP 服务器将仅用于脚本处理。Nginx 启用通过 IP 地址连接到后端:
服务器{
服务器名称ruhighload.com;
根 /var/www/ruhighload;
索引index.php;
位置 ~* .(php)$ {
fastcgi_pass 10.10.10.1:9000;
fastcgi_index index.php;
包括 fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
请记住,如果您使用文件加载,则需要将文件存储分配给单独的节点。
使用多个后端
当负载增加时,Web 应用程序的运行速度会开始变慢。有时,原因可能在于实现本身。为了避免此类问题,您应该使用多个 PHP 后端。
安装后端时,请确保它们具有相同的配置。使用 Nginx 来平衡它们之间的负载。为此,您应该在上游定义后端列表,并在配置中使用它:
上游后端 {
服务器 10.10.10.1;
服务器 10.10.10.2;
服务器 10.10.10.3;
}
服务器 {
server_name ruhighload.com;
root /var/www/ruhighload;
index index.php;
location ~*. (php) ${
fastcgi_pass backend;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name;
}
}
当你开始使用多个后端时,来自同一用户的请求将被发送到不同的服务器。这将需要所有会话使用同一个存储库。
例如,您可以选择 Memcache。此外,您还需要连接缓存服务器。Memcache 会使用常量哈希算法,独立地在所有服务器之间分配负载。
任务队列和 DNS 平衡
任务队列支持异步执行繁重操作,而不会降低主应用程序的运行速度。当队列服务器从 Web 解决方案接收任务时,其他服务器也会处理这些任务。如果队列中的平均任务数量增加,请增加服务器数量以平衡负载。
DNS 支持基于轮询的负载均衡,允许指定多个接收 Web 服务器(称为前端)的 IP 地址。您需要安装多个相同的前端,以便 DNS 为不同的客户端分配不同的 IP 地址。这样,您就可以确保前端之间的负载均衡。
文件存储
文件的上传和处理通常发生在后端。拥有多个后端非常不方便且效率低下,因为软件工程师必须记住每个文件上传到哪个后端。
此外,它们还会降低后端性能。为了避免此类问题,您应该使用单独的服务器来加载、存储和处理文件。
您可以按照以下方式进行:
- 为文件服务器定义单独的子域
- 在服务器上部署Nginx和一个可以存储文件并处理文件的小型应用程序
- 通过添加新服务器和子域进行扩展(例如,images1、images2、images3 等)
- 将文件加载转移到客户端,以便表单向某个服务器发送请求
创建一个能够随着流量增长而按比例跨服务器扩展的应用程序并不难。一切无状态、负载均衡、90% 缓存、可靠的内容分发网络等等——这样你就拥有了一个高负载架构。
然而,成本效益才是关键。假设你有10万用户,但只有一台服务器。那么,为了获得其中的13万用户,你就需要再部署一台服务器。这看起来相当困难,不是吗?
因此,你应该退一步思考——系统的哪个部分导致了问题?如果是数据库,请在开始项目开发之前选择一个高可扩展性的数据库。或者,你可以使用多个数据库,例如,一个用于写入,一个用于读取(CQRS)。
提前定义并解决此类性能问题,并且不会大幅增加基础设施成本,是确保高负载的有效做法。
文章来源:https://dev.to/smartym/how-to-build-a-high-load-architecture-for-your-web-project-4e8n