gpt4 book ai didi

php - 具有 SerializesModels 特征的 Laravel 队列作业检索过时的模型数据

转载 作者:行者123 更新时间:2023-12-03 06:44:42 24 4
gpt4 key购买 nike

我正在通过 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对模型的调用在调度通知之前明确执行(同步),因此在处理作业时应该没有办法保存它。
我在 Kubernetes 上运行并使用 MySQL 数据库。一切都在 GCP 上(如果相关的话)。
有人有想法吗?添加几秒钟的延迟不是一个很好的解决方案,也不应该是必要的。

最佳答案

看来我们的数据库使用了过多的 CPU,导致它定期切换到故障转移。我认为这是问题的原因。在实现减少数据库负载的调整后,问题得到解决。解决此问题的方法是稍微延迟(如我的问题中所述)。
我不确定为什么这似乎只影响通知,而不影响其他队列作业或请求。如果有人有更详细的解释,请随时发布新答案。

关于php - 具有 SerializesModels 特征的 Laravel 队列作业检索过时的模型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63153132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com