Laravel中的延迟队列可以用作CRON作业的替代方案吗



Laravel 4在队列方面有一个很棒的功能列表。这个问题是关于队列方法Queue.later() API文档的,第一个参数是delay

Cron基本上是用来执行重复任务的。

如果下面的片段在时间可配置的情况下变得更通用,也可以:

  1. 这是否可以作为CRON工作的替代方案
  2. 假设我们使用IronMQ,这是否是一种故障安全的方法

-

class SendEmail {
    public function fire($job, $data)
    {
    //Connect to SMTP and send email
    $job->delete();
    //Recall the queue with a delay
        Queue::later(60,'SendEmail@send', array('message' => $message));
    }
}

//app/events/MailHandler.php
public class MailHandler(){
    public function onMailListenerStarted(){
        Queue::push('SendEmail@send', array('message' => $message));    
    }
}

您必须记住,队列和Cron任务是两件不同的事情。

  • cron作业将每隔一分钟启动一次(具体取决于您如何配置它)
  • 队列作业将在延迟时间结束后运行,并且轮到他进行处理

因此,将其与Cron"执行重复任务"的定义进行比较,Queue并没有这样做。乔布斯只是在排队等候,他们什么也不做。延迟工作会给你一个优势,它至少会等到时间到了再发送,但它不会尝试一次性发送所有电子邮件。如果这样做的缺点是可能需要很长时间才能发送,但为了防止这种情况,您可以简单地使用更多的工作人员来处理队列。

您需要一个处理队列的脚本,您很可能希望从cron开始。

我在代码片段中看到的方法的另一个问题是,如果将作业添加回队列出现问题,则该作业将丢失,并且永远不会添加回队列。

因此,为了回答您的问题:

  1. 不,队列不是作业的替代方案,但队列确实使cron脚本中的数据处理更容易

  2. 理论上,无论您的队列提供程序有多好,这都不是故障安全的方法。但是,可以创建一些脚本来检查队列是否仍在执行它应该执行的所有操作,但这确实需要一些日志记录(例如,上次运行作业时保存)。

。。2年后

这是一种防故障的方法吗?Laravel Forge使添加和监督队列工作人员变得非常可靠,大大减轻了的痛苦,值得一看。

所以,是的,不知道是否是故障安全的,但肯定比过去更可靠。

最新更新