我有一个使用redis和Laravel(5.1)队列的项目。
在我们的案例中,在部署之后,特定作业开始失败,导致在redis中积压数万个作业。在特定作业类中的代码中发现逻辑问题后,部署了一个修复程序,该修复程序也删除了一个类范围的变量。
但是,当类被序列化并以redis形式存储时,当排队的作业重试排队的作业然后失败,因为Laravel工作者试图访问现在不存在的类范围变量。我通过发布带有变量的进一步部署来修复此问题。
将来如何避免这种情况?有没有办法刷新序列化的作业代码,或者更好的方法来捕获这种错误? Laravel在Redis中使用的序列化对象方法在排队项和Laravel代码之间创建了一个依赖关系,我宁愿避免。
答案 0 :(得分:0)
这是一个很大程度上未记录的问题。文档的最新内容指出以下内容可以通过引发的异常和模型类布尔值帮助解决问题:
将Eloquent模型注入作业时,它将自动序列化,然后放入队列,并在处理作业时恢复。但是,如果在等待作业处理该作业时删除了该模型,您的作业可能会失败,并出现ModelNotFoundException。
为方便起见,您可以通过将作业的deleteWhenMissingModels属性设置为true来选择自动删除缺少模型的作业:
/**
* Delete the job if its models no longer exist.
*
* @var bool
*/
public $deleteWhenMissingModels = true;
在上下文中阅读有关内容: