Laravel通知门面队列响应时间

Laravel通知门面队列响应时间,laravel,laravel-5.5,Laravel,Laravel 5.5,Laravel文档解释说,在分派/发送通知时,您可能希望将它们排队以加快应用程序响应时间 这正是我想要做的,但是我使用通知外观而不是应通知特性来称呼它。我关心的是前者绕过了队列,我需要它立即通知一组用户 正如文件中所说: 或者,您可以通过通知门面发送通知。 这主要在您需要向发送通知时非常有用 多个应报告实体,如用户集合 但当我通过门面调用通知时,它不会排队。我知道这一点,因为当我监视我的网络请求并注释掉facade调用时,我的请求从超过2秒(带有通知调用)到不足0.5秒(当我注释掉它时) 下面

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

这正是我想要做的,但是我使用通知外观而不是应通知特性来称呼它。我关心的是前者绕过了队列,我需要它立即通知一组用户

正如文件中所说:

或者,您可以通过通知门面发送通知。 这主要在您需要向发送通知时非常有用 多个应报告实体,如用户集合

但当我通过门面调用通知时,它不会排队。我知道这一点,因为当我监视我的网络请求并注释掉facade调用时,我的请求从超过2秒(带有通知调用)到不足0.5秒(当我注释掉它时)

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

我做错了什么

哦。。。似乎正在触发队列:

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

那为什么这么慢呢(

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

  • 使用其他队列驱动程序,如Amazon SQS、Beanstalkd、Redis等。它们针对低延迟的工作队列进行了优化。与作为工作队列的数据库相比,它们的速度非常快

  • 创建另一个作业并让工作人员将所有通知排队,例如:

    php artisan make:job QueueUserNotificationsJob
    
    YourController.php

    dispatch(new QueueUserNotificationsJob(Auth::user()->id));
    
    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));
    
    }
    
    QueueUserNotificationsJob.php

    dispatch(new QueueUserNotificationsJob(Auth::user()->id));
    
    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));
    
    }
    

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

  • 使用其他队列驱动程序,如Amazon SQS、Beanstalkd、Redis等。它们针对低延迟的工作队列进行了优化。与作为工作队列的数据库相比,它们的速度非常快

  • 创建另一个作业并让工作人员将所有通知排队,例如:

    php artisan make:job QueueUserNotificationsJob
    
    YourController.php

    dispatch(new QueueUserNotificationsJob(Auth::user()->id));
    
    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));
    
    }
    
    QueueUserNotificationsJob.php

    dispatch(new QueueUserNotificationsJob(Auth::user()->id));
    
    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));
    
    }
    


  • 您是否在您的用户模型中包含了应通知的特征?@WhyDoesMyCodeWork是的,已确认它在那里。@WhyDoesMyCodeWork请参阅命令行输出编辑…队列使用的是哪个驱动程序?@WhyDoesMyCodeWork数据库您是否在您的用户模型中包含了应通知的特征?@WhyDoesMyCodeWork是的,已确认它在那里。@WhyDoesMyCodeWork请参阅comm和行输出编辑…你在队列中使用哪个驱动程序?@WhyDoesMyCodeWork数据库我认为
    通知上实现的
    应该队列
    可排队
    的全部要点是将其排队而不必这样做。不是以异步的方式运行
    通知::发送
    ,还是不创建新作业与在通知本身上实现
    ShouldQueue
    之间有什么区别?延迟用于将作业推入队列(创建作业),不消耗作业。如果将数据库用作队列驱动程序,则它不会作为工作队列进行优化,它只是逐个插入作业,这是非常缓慢的操作。这就是为什么我们将使用替代队列驱动程序。因此,通过使用一个作业对各种通知进行排队,我可以避免延迟…此时我不能使用其他驱动程序。请执行通知然后需要
    ShouldQueue
    Queueable
    或者我可以摆脱它们吗?还有一些文档或源代码,你可以告诉我关于
    创建
    消费
    作业和队列以及相关的时间安排吗?这对我来说非常有趣。
    ShouldQueue
    应该实现,如果你需要的话nt将作业分配给不同的工人。例如,您有4个工人,没有
    ShouldQueue
    ,新的实现一个工人用于创建和使用作业,但是
    ShouldQueue
    实现后,一个工人用于创建作业,之后,所有工人都用于使用作业。这就是区别。我认为
    通知上实现ShouldQueue
    Queueable
    是在不必这样做的情况下对其进行排队。运行
    Notification::send
    的方式是否应该是异步的?这就是创建新作业和在通知本身上实现
    ShouldQueue
    之间的区别所在?lag用于将作业推入队列(创建作业),不消耗作业。如果将数据库用作队列驱动程序,则它不会作为工作队列进行优化,它只是逐个插入作业,这是非常缓慢的操作。这就是为什么我们将使用替代队列驱动程序。因此,通过使用一个作业对各种通知进行排队,我可以避免延迟…此时我不能使用其他驱动程序。请执行通知然后需要
    ShouldQueue
    Queueable
    或者我可以摆脱它们吗?还有一些文档或源代码,你可以告诉我关于
    创建
    消费
    作业和队列以及相关的时间安排吗?这对我来说非常有趣。
    ShouldQueue
    应该实现,如果你需要的话nt将作业分派给不同的工作人员。例如,您有4个工作人员,如果没有
    ShouldQueue
    ,新的实现一个工作人员用于创建和使用作业,但是
    ShouldQueue
    实现后,一个工作人员用于创建作业,之后,所有工作人员都用于使用作业。这就是区别。