在应用程序大小的这个特定点上,我将重点介绍对基础结构和代码逻辑的两项特定改进。
- 将向最终用户提供横幅广告素材资源所需的流程与存储广告展示所需的流程分离。
- 实现用于接收请求的水平可扩展基础结构。
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;
总结
尽管通过优化存储方法和服务器调整,您绝对可以看到良好的性能改进,但在大型应用程序中的某些时候,您将希望能够添加其他服务器来完成工作。我认为通过上述步骤,您将处于一个非常好的位置,随着应用程序规模的增长而顺利扩展。