Laravel 为了防止超时,将作业排队与将结果分块相比有什么好处?

Laravel 为了防止超时,将作业排队与将结果分块相比有什么好处?,laravel,laravel-5,Laravel,Laravel 5,我的Laravel 5网站允许用户向联系人发送电子邮件。我的问题是,该操作在循环通过大约50个触点后超时 我的流程概述: 获取联系人列表 构造电子邮件 循环浏览联系人列表,并使用邮件服务向每个联系人发送电子邮件 将电子邮件详细信息返回控制器以保存在数据库中 分块是很容易理解的,但我对将作业放入队列的机制并不太熟悉 为了防止超时,我最好将联系人分块以限制循环的大小,还是将整个作业放在队列中?如果整个作业都应该放在队列中,我仍然可以将联系人分块吗?排队作业是否仍然可以使用mail::queue,

我的Laravel 5网站允许用户向联系人发送电子邮件。我的问题是,该操作在循环通过大约50个触点后超时

我的流程概述:

  • 获取联系人列表
  • 构造电子邮件
  • 循环浏览联系人列表,并使用邮件服务向每个联系人发送电子邮件
  • 将电子邮件详细信息返回控制器以保存在数据库中
分块是很容易理解的,但我对将作业放入队列的机制并不太熟悉

为了防止超时,我最好将联系人分块以限制循环的大小,还是将整个作业放在队列中?如果整个作业都应该放在队列中,我仍然可以将联系人分块吗?排队作业是否仍然可以使用mail::queue,或者这只是多余的

循环代码:

public function sendIndividualEmail($members, $subject, $body, $file)
   {

     $view  = 'emails.memberMessage';

     //construct email details
     $mData = $this->emailConstructor($subject, $body);

     //check to see if there is an attachment, if so upload it.
     if (!is_null($file)){
            $uploadedFile = $this->attachment->saveAttachment($file);

            $mData['path'] = 'https://'.$_SERVER["HTTP_HOST"].'/uploads/attachments/'.$uploadedFile['filename'];
            $mData['display'] = $uploadedFile['display'];
        }


     foreach($members as $member){

                if (!empty($member->contact_email)){

                  //add member details here
                    $mData['email'] = $member->contact_email;
                    $mData['name'] = $member->contact_firstName;

                   //email member
                    $this->emailTo($view, $mData);
                    $mData['emailCount']++;
                }           

    }
    return $mData;
}
邮递服务:

public function emailTo($view, $mData)
 {

    Mail::queue($view, $mData, function($message) use ($mData)
    {
      $message->from($mData['from'], $mData['fromName']);
      $message->to($mData['email'], $mData['name'])->subject($mData['subject']);
      $message->getHeaders()->addTextHeader('X-MC-Metadata', $mData['meta']);
        if(array_key_exists('path', $mData)){
            $message->attach($mData['path'], array('as' => $mData['display']));
        }
    });
}

您可以对整个作业进行排队,但仍然可以对邮件进行排队,我在应用程序中这样做,并不觉得这是多余的。它允许您将处理分解为相互独立的逻辑步骤。例如,作业可以继续处理联系人和安排电子邮件,而无需等待他们发送

虽然我自己还没有这样做,但我相信您能够将联系人分组,并在工作中仍然使用队列。

首先提出一些建议。 分块将使用较少的计算能力,但不能提供队列系统所提供的灵活性

分块场景--- 获取所有模型,将(x)计数为新块存储块。 Foreach块作为项目 项目中的每个项目 项目->剂量测量

--分页 我可能会修改分页库来支持这一点。 例如,获取一个集合并对其分页,存储页码,然后一次只做一页记录

--事件观察者队列? 另一种技术是使用事件侦听器系统。 你可以用很多方法来解决这个问题,只要想想什么时候应该发送电子邮件就可以了

您的模型可能会有一个类似sent_mymail_email的列,或者如果电子邮件已发送(作业已完成),您可以使用mutator getsentmaymailailattribute()返回布尔值true

然后,您将设置一个新事件或锁定现有事件

见:

队列系统-- 队列系统将通过http请求从一台服务器接收事件和数据。然后将这些项目添加到需要完成的作业的大列表中。当事件出现时(轮到它了),它将向系统上的某个地方发送http请求。然后,系统解释任务是什么并完成任务,完成后,将向队列系统(通常)发送响应,通知系统已完成的任务。然后队列将转到下一个任务,发送请求。。。等等

与chunk方法相比,您可以看到应用程序在这两种情况下都需要发送电子邮件,但是它不需要发送任务、接收任务或解释chunk方法中的任务

在分块方法中,移动部分也较少,但是,如果您希望能够扩展应用程序工作负载的一部分并将其放到辅助系统或集群上以处理作业,那么您应该使用队列系统

队列系统依赖于具有自身内置缺陷的第三方服务。例如,您不能为这些项目定义订单

这篇博文解释道:

下面是另一篇关于使用队列系统的贴子:

简单地说,其优势主要在于,您能够扩展到大量正在处理的请求,而不会对前端(应用程序)产生任何影响


您可以在单独的系统或系统集群上运行这些作业,以将所需的工作推送到不影响用户体验的服务器。

我认为设置队列是我感兴趣的事情。谢谢你的精彩解释。精彩的解释,它指引我在我的应用程序中做其他事情的几种方法