作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在通过 redis 使用 Laravel 队列来发送通知。但是,每当我将模型传递给通知时,当通知通过队列发送时,它们的属性就会过时。
这基本上就是我正在做的事情:
在 Controller (或其他)中:
$thing = new Thing(); // Thing is a model in this case.
$thing->name = 'Whatever';
$thing->save();
request()->user()->notify(new SomethingHappened($thing))
发生了什么事.php:
<?php
namespace App\Notifications;
use App\Thing;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class SomethingHappened extends Notification implements ShouldQueue
{
use Queueable;
public $thing;
public function __construct(Thing $thing)
{
$this->thing = $thing;
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
dump($this->thing->name); // null
return (new MailMessage())
// ...
// ...
// ...
;
}
}
现在,当我添加几秒钟的延迟(即
(new SomethingHappened($thing))->delay(now()->addSeconds(5))
)时,检索到的模型是最新的。此外,在我部署了足够多的队列工作人员(并且他们在填充队列上落后)之前,这个问题并不存在。因此,现在看来,当队列作业得到非常快速的处理时,它不会正确地从数据库中检索模型或模型尚未保存。我不知道为什么会发生这种情况,因为
save
对模型的调用在调度通知之前明确执行(同步),因此在处理作业时应该没有办法保存它。
最佳答案
看来我们的数据库使用了过多的 CPU,导致它定期切换到故障转移。我认为这是问题的原因。在实现减少数据库负载的调整后,问题得到解决。解决此问题的方法是稍微延迟(如我的问题中所述)。
我不确定为什么这似乎只影响通知,而不影响其他队列作业或请求。如果有人有更详细的解释,请随时发布新答案。
关于php - 具有 SerializesModels 特征的 Laravel 队列作业检索过时的模型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63153132/
我正在通过 redis 使用 Laravel 队列来发送通知。但是,每当我将模型传递给通知时,当通知通过队列发送时,它们的属性就会过时。 这基本上就是我正在做的事情: 在 Controller (或其
我有一个有几个听众的 laravel 事件。一些监听器或它们的通知(取决于它们是否耗时)正在实现 ShouldQueue,因此它们在 redis 队列的后台运行。该事件默认使用 SerializesM
我是一名优秀的程序员,十分优秀!