我正在开发一个现有的自定义电子商务PHP应用程序,该应用程序目前每15分钟运行一次资源密集型的CRON。
它的要点是:客户可以为他们感兴趣的产品设置复杂的过滤器,并根据这些过滤器接收电子邮件。每15分钟运行一次的CRON会检查自上次运行以来列出的所有新产品,并将它们与每个客户过滤器进行比较。如果产品与客户过滤器匹配,则会通过amazon SES发送电子邮件。
到目前为止,这种方法一直运行正常,但随着活跃客户数量的快速增长,CRON开始每15分钟对应用程序进行一次显着的性能下降,持续一两分钟运行。
我一直在用其他想法来帮助分散服务器上的负载,例如每次列出产品时执行任务,因此服务器不需要一次赶上多个产品
接近这样的事情时,通常最好的做法是什么?
答案 0 :(得分:0)
我推荐的方法是使用一个rabbitmq队列,你的cron将发送消息。然后设置几个消费者(将在队列的另一端等待的脚本)逐个接收消息,撰写电子邮件并将其发送给客户。 这样,您可以扩展消费者数量以匹配需要发送的电子邮件量。 如果队列不是您熟悉的,请查看RabbitMQ教程:https://www.rabbitmq.com/tutorials/tutorial-one-php.html
答案 1 :(得分:0)
消息队列非常适合您,您可以轻松地使用enqueue库来使用它们。关于你为什么要选择它的几句话:
您需要一个supervisord(或任何其他进程管理器),而不是定义cron任务。必须将其配置为运行consume
命令。有关详情,请参阅doc。
每当消息发布时,它都会被传递给消费者(由经纪人)并且正在处理中。
我建议使用RabbitMQ经纪人。