Laravel通知门面队列响应时间

时间:2018-03-31 15:26:03

标签: laravel laravel-5.5

Laravel文档解释说,在调度/发送通知时,您可能希望将它们排队以加快应用程序响应时间。

https://laravel.com/docs/5.5/notifications#queueing-notifications

这正是我想要做的,但是我使用通知外观而不是通知特征来调用它。我担心的是前者绕过队列,我需要它立即通知一组用户。

正如文档中所述:

  

或者,您可以通过通知外观发送通知。   这在您需要发送通知时非常有用   多个可通知的实体,例如用户集合。

但是当我通过立面调用我的通知时,它不会排队。我知道这一点,因为当我监视我的网络请求并注释掉外观调用时,我的请求从2秒以上(通知通知)到0.5秒以下(我发表评论时)。

以下是使用队列(NewAsset)的通知类的开始:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class NewAsset extends Notification implements ShouldQueue
{
    use Queueable;

这是电话:

$asset = new Asset;
$asset->user_id = Auth::user()->id;
$asset->type = "Text";
$asset->content = $content;
$asset->forum_id = 1;
$asset->save();
$users = User::where("id","!=",Auth::user()->id)->get();
Notification::send($users, new NewAsset($asset,Auth::user()));
//if i comment out the notification call above, response time decreases dramatically 
return;

我做错了什么?

哦......似乎它正在触发队列:

php artisan queue:listen
[2018-03-31 15:48:22] Processing: App\Notifications\NewAsset
[2018-03-31 15:48:22] Processed:  App\Notifications\NewAsset
[2018-03-31 15:48:23] Processing: App\Notifications\NewAsset
[2018-03-31 15:48:23] Processed:  App\Notifications\NewAsset
[2018-03-31 15:48:24] Processing: App\Notifications\NewAsset
[2018-03-31 15:48:24] Processed:  App\Notifications\NewAsset
[2018-03-31 15:48:25] Processing: App\Notifications\NewAsset
[2018-03-31 15:48:25] Processed:  App\Notifications\NewAsset

为什么这么慢? :(

1 个答案:

答案 0 :(得分:2)

Notification::send很慢(> 2秒),很可能,您有数千个需要通知的实体推送到数据库队列,这很慢,因为数千个插入语句在数据库上执行。要改进,您可以:

  1. 使用其他队列驱动程序,例如Amazon SQS,Beanstalkd,Redis等。它们针对具有低延迟的工作队列进行了优化。与数据库作为工作队列相比,它们快速闪电。

  2. 创建另一个作业并让工作人员对所有通知进行排队,例如:

    php artisan make:job QueueUserNotificationsJob
    

    <强> YourController.php

    dispatch(new QueueUserNotificationsJob(Auth::user()->id));
    

    <强> QueueUserNotificationsJob.php

    public $authUserId = null;
    
    public function __construct($authUserId) {
    
        $this->authUserId = $authUserId;
    
    }
    
    public function handle() {
    
        $users = User::where("id", "!=", $this->authUserId)->get();
    
        Notification::send($users, new NewAsset($asset, $this->authUserId));
    
    }