在大量访问时加载iframe内容的延迟和低速

2022-08-30 23:35:47

在将存储多个记录的系统上工作。
为了减少 I/O 并提高速度,我将存储从一个数据库更改为另一个文件。因此,数据将更改为 json 并直接写入文件。4 millionper day


更多信息

该系统是由PHP编写的系统,通过iframe在具有自己服务器的多个站点中显示横幅。ppc

每当此横幅加载到任何站点中时,我都会将其信息的一条记录存储在文件中(之前是插入到数据库的),并更新数据库中的拖曳表中的拖曳字段。


问题

当访问量上升并达到每分钟近3000次访问时,iframe加载速度会显着降低,有时更有时会导致iframe中的打印服务器超时。

我正在寻找减少资源使用和提高加载速度的方法,并防止超时。

任何帮助将不胜感激...


答案 1

每分钟有 3000 个请求,并且希望有所增长,您需要开始利用架构和工具。big data

以下是一些需要考虑的全局亮点:

  • 使用单独的来存储和提供图像。CDN
  • 使用软件来存储数据,例如hadoopmapReduce
  • 获取的服务器,而不是一个巨大的服务器。distributed
  • 添加服务器。load balancing
  • 关闭所有不需要的php功能和扩展。

答案 2

在应用程序大小的这个特定点上,我将重点介绍对基础结构和代码逻辑的两项特定改进。

  1. 将向最终用户提供横幅广告素材资源所需的流程与存储广告展示所需的流程分离。
  2. 实现用于接收请求的水平可扩展基础结构。

1. 将投放横幅与存储展示次数分离

通过分离这两个问题,您将能够为服务的客户提供更一致的性能。如果尚未使用 CDN,或者以其他方式减轻服务器提供映像本身的需求,可以帮助显著缩短响应时间。ppc

另一个可以为您带来巨大收益的领域是将横幅代码的投放与将展示数据存储到磁盘的流程分开。有很多方法可以做到这一点,但我有经验的一个成功的解决方案是利用ActiveMQ(http://activemq.apache.org/)或类似的排队系统。排队系统通过将展示数据存储在内存中,并以一致的速率将这些数据点发送到可以将该数据存储到数据库或其他存储介质中的消费者(也称为worker)进程,从而帮助平衡一段时间内的展示存储负载。这样,在磁盘上实际存储展示次数的工作负载就可以与投放广告的过程分开。您还可以设置多个进程来使用排队的作业,这将导致第二个改进领域。

2. 可水平扩展的基础架构

构建水平可扩展的解决方案基本上意味着,您无需增加单个服务器的大小和功率,只需添加其他较小的服务器,这些服务器将平均分担系统需求的工作负载。这具有多种优点,其中之一是向池中添加更多的小型服务器更容易(并且通常更便宜),而不是将一台大型服务器升级到更大,更强大。它还具有在服务器发生故障时更加健壮的优点。

在这种情况下,我认为一个好的解决方案是让一台服务器或进程充当路由器,这将通过将请求发送到执行请求实际处理的不同服务器来平衡请求。在互联网上有很多关于在PHP中构建路由或负载平衡脚本的良好资源,但基本上您将在一个端点上接收请求,然后将该请求发送到另一台服务器以实际实现。如果构建准备接收请求的服务器的动态列表,则当您开始看到不可接受的性能时,可以轻松增加满足请求的服务器数量。这还将为您提供这样的好处,即如果服务器出现故障,则可以轻松地从列表中删除服务器,然后任何流量都会被路由到仍在运行的其他服务器。

如果您还没有,最好将lighttpd(http://www.lighttpd.net/)或nginx(https://www.nginx.com/)作为Apache的替代品,它们能够以更少的开销处理大量请求。这些特别适合处理路由器服务器上的请求。

一旦为请求设置了水平扩展,那么为存储服务器设置水平扩展就相当简单了。您可以通过按池中的服务器数量修改 ID 来确定发送请求的位置,从而轻松执行此操作。

$serverNumber = $adID % $availableServers;

总结

尽管通过优化存储方法和服务器调整,您绝对可以看到良好的性能改进,但在大型应用程序中的某些时候,您将希望能够添加其他服务器来完成工作。我认为通过上述步骤,您将处于一个非常好的位置,随着应用程序规模的增长而顺利扩展。


推荐