2017-03-23 73 views
2

我正在开发一个现有的自定义电子商务PHP应用程序,该程序当前每15分钟运行一个资源密集型CRON。计划任务PHP替代方案

它的要点是:客户可以为他们感兴趣的产品设置复杂的过滤器,并接收基于这些过滤器的电子邮件。 CRON每15分钟运行一次,检查自上次运行以来所列的所有新产品,并将其与每个客户过滤器进行比较。如果产品符合客户过滤条件,他们会通过亚马逊SES发送电子邮件。

到目前为止,这种方法一直正常,但随着活跃客户的数量迅速增加,CRON开始每15分钟就会在应用程序上做出明显的性能下降,这会持续一两分钟的时间它运行。

我一直在尝试其他方法来帮助分散服务器上的负载,例如每次产品列出时执行任务,因此服务器无需一次追赶多个产品。

当接近这样的事情时,通常最好的做法是什么?

+0

我做了类似的事情,除了我有系统设置总是在一定的时间发出一批,所以我的Cron只会每3小时运行一次。 – xlordt

+1

队列(使用例如rabbitmq)并将负载分散到多个服务器上。 – solarc

回答

0

我推荐的方法是在您的cron将发送消息的地方使用rabbitmq队列。然后设置几个消费者(将在队列的另一端等待的脚本),逐个接收消息,撰写电子邮件并将其发送给客户。 这样,您可以缩放消费者的数量以匹配需要发送的电子邮件的数量。 如果队列不是你熟悉的东西,看看在RabbitMQ的教程:https://www.rabbitmq.com/tutorials/tutorial-one-php.html

0

消息队列伏贴好,你可以很容易地利用他们与enqueue库。只是你为什么要选择这几句话:

  • 它支持a lot of transports从最简单的一个(文件系统)对企业的人(RabbitMQ的或Amazon SQS)。
  • 它配备了非常强大的bundle
  • 它具有最高级别的抽象,可以轻松使用。
  • 还有很多可能派上用场的。

而不是定义cron任务,你需要一个supervisord(或任何其他进程管理器)。它必须配置为运行consume命令。更多内容请见doc

每当消息发布时,消息(由代理)传递给消费者并且正在处理中。

我建议使用RabbitMQ代理。