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
为什么这么慢? :(
答案 0 :(得分:2)
Notification::send
很慢(> 2秒),很可能,您有数千个需要通知的实体推送到数据库队列,这很慢,因为数千个插入语句在数据库上执行。要改进,您可以:
使用其他队列驱动程序,例如Amazon SQS,Beanstalkd,Redis等。它们针对具有低延迟的工作队列进行了优化。与数据库作为工作队列相比,它们快速闪电。
创建另一个作业并让工作人员对所有通知进行排队,例如:
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));
}