【问题标题】:Job always fails at laravel jobs Redis rate limiting作业总是在 laravel 作业中失败 Redis 速率限制
【发布时间】:2018-10-26 17:54:13
【问题描述】:

这是一个后续 Laravel - Running Jobs in Sequence

我决定使用 redis 速率限制。代码如下

jobClass {

  protected $subscription;

  public function __construct(Subscription$subscription) {
        $this->subscription= $subscription;
    }
  public function handle() {
    Redis::funnel('mailingJob')->limit(1)->then(function () {
            // Job logic...
            (new Mailer($this->subscription))->send();

        }, function () {
            // Could not obtain lock...
            return $this->release(10);
        });
  }
}

控制器代码看起来像。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Subscriptions;
class MailController extends Controller
{


    public function sendEmail() {
        Subscriptions::all()
        ->each(function($subscription) {
            SendMailJob::dispatch($subscription);
        });
    }
}

现在,当我运行队列时,其中一些工作休息(大约 90%)失败,出现以下错误。

SendMailJob 尝试次数过多或运行时间过长。这份工作可能有 以前超时。

我错过了什么?请有人指导我正确的方向。

我的目标是一次只运行一个类型的作业。

【问题讨论】:

标签: laravel redis laravel-5.6 laravel-horizon


【解决方案1】:

The Laravel documentation 对此有提示:

使用速率限制时,您的作业需要成功运行的尝试次数可能很难确定。因此,将速率限制与基于时间的尝试结合起来很有用。

问题的核心是,作业一直失败,直到它可以实现锁定并运行。

所以我想你在哪里运行队列工作者,你没有将--tries 标志设置得足够高。

虽然您可以设置一个非常高的--tries,但它并不是真正可扩展的。

按照文档中的建议,最好的解决方案是增加尝试次数以及使用time based attempts

您也可以在这里增加return $this-&gt;release(10);的发布时间。这应该让作业在尝试重新获取锁之前等待更长的时间,因此会使用更少的尝试!

【讨论】:

  • 如果没有--tries 选项,尝试次数没有限制
  • @TravisBritz,啊,我不确定。将更新答案,谢谢!
【解决方案2】:

[...] has been attempted too many times or run too long 是一个错误,它不会告诉您作业失败的原因。这意味着其他一些异常导致您的工作在每次工作人员尝试时都失败,并且工作人员已经尝试了您的配置允许的最大次数。要了解它失败的原因,请检查您的 laravel.log 文件以了解导致作业失败的异常。

在您的情况下,由于Mailer 正在联系外部系统,因此您连接的系统可能对您进行了速率限制,或者他们可能存在临时连接问题或其他服务停机时间。同样,您的日志文件中应该有更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多