这是关于 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尝试了太多次或运行了太长时间。这份工作可能有 以前超时。
我想念什么?请有人指引我正确的方向。
我的目标是一次只执行一种类型的作业。
答案 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
正在与外部系统联系,这可能是您正在连接的系统限制了您的速率,或者它们可能存在暂时的连接问题或其他服务停机。同样,日志文件中应该有更多详细信息。