在laravel作业中作业总是失败Redis速率限制

时间:2018-10-26 17:54:14

标签: laravel redis laravel-5.6 laravel-horizon

这是关于 Laravel - Running Jobs in Sequence

我决定采用Redis速率限制。代码在下面

export default class ColorRender extends Component {
  constructor(props) {
  super(props);

  this.onChange = this.onChange.bind(this);
}

onChange(e) {
  this.props.onChange(e.target.value);
}

render() {
   const disabled = this.props.disabled || this.props.readonly;

return (
  <div
    style={{ position: 'relative' }}
  >
    <input
      type="text"
      value={this.props.value}
      placeholder={this.props.placeholder}
      onChange={this.onChange}
      style={{
        marginBottom: 20,
        width: `calc(100% - ${COLOR_BOX_WIDTH}px - ${COLOR_BOX_MARGIN_RIGHT}px - ${COLOR_BOX_MARGIN_LEFT}px)`,
      }}
      disabled={disabled}
    />

    <div
      style={{
        ...contentStyle,
        backgroundImage: `url(${emptyBackground})`,
      }}
    />

    <div
      className="color-display"
      style={{
        ...contentStyle,
        backgroundColor: this.props.value,
        zIndex: 1000,
      }}
    />
  </div>
);
}
}

控制器代码如下。

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);
        });
  }
}

现在,当我运行队列时,其中一些可以正常工作(大约90%),但由于以下错误而无法工作。

  

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

我想念什么?请有人指引我正确的方向。

我的目标是一次只执行一种类型的作业。

2 个答案:

答案 0 :(得分:1)

The Laravel documentation对此有一个提示:

  

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

问题的核心是,作业会一直失败,直到可以锁定并运行为止。

因此,我想您正在运行队列工作器的地方,没有将label标志设置得足够高。

尽管您可以设置非常高的waitSearcher,但它实际上并不是可扩展的。

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

您还可以在此处增加--tries的发布时间。那应该使作业等待更长的时间才能尝试重新获得锁定,因此将减少尝试次数!

答案 1 :(得分:0)

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

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