PHP接收并响应数千个请求 - 在场景后进行计算

时间:2015-08-07 23:14:56

标签: php parallel-processing redis queue message-queue

我正在开发一个PHP脚本:

  • 收到客户请求;
  • 通过CPU-and-Time-Intensive-binary-computation
  • 处理请求
  • 将计算结果存储到MySQL数据库中
  • 然后使用Status 200 OK
  • 回复客户

问题:在高峰时段每秒有1000个请求中有10个:客户端需要等待很长时间才能收到Status 200 OK

灵活性:脚本不需要使用计算结果响应客户端。该脚本甚至不需要根据计算的成功/失败来响应Status 200 OK - 计算可能最终失败并且完全没问题。因此实际计算可能真的在场景后面并行发生。

应该使用哪些工具/包/库/策略来实现PHP上的这种密集请求处理设计?它甚至是PHP方面的东西还是可以从Apache方面解决的?

注意:

  • 在Ubuntu上运行Apache,MySQL,PHP,Redis [AMPRU]
  • 客户只会发送请求并立即收到Status 200 OK
  • 客户端不会等待完成请求的计算。
  • 没有自动缩放或负载均衡的概念:它是一个AMPRU服务器。
  • 如果多个计算可以在幕后并行发生,那就更好了

1 个答案:

答案 0 :(得分:2)

这是队列的经典用例。在你列出的技术堆栈中,Redis支持队列(查看库的PHP-Resque),或者还有其他可以使用的工具,例如Beanstalkd(我最喜欢的,带有Pheanstalk PHP库)或亚马逊SQS。还有许多其他选项,包括自托管,或作为服务提供。

网站或其他机制接收数据并排队 - 返回200 OK。后端工作者,像基于cron的系统一样简单,或者(更好)多个长时间运行(偶尔重新启动到清理)脚本,从队列中提取项目并执行工作,从而保存结果。

我通过这样的系统实际上运行了数亿个这样的工作。工作人员如果能够到达队列和数据库服务器,甚至不必在同一台机器上运行(我在多台服务器上运行了数十名工作人员)。