我想知道重新排队一个laravel工作是否是一个坏主意。我有一个场景,一旦用户将Facebook帐户集成到我的应用程序中,我就需要从Facebook上拉出用户的帖子。我想提取{x}天历史数据。Facebook api 像任何其他 api 一样,每分钟有 api 请求的限制。我跟踪请求标头,一旦达到速率限制,我就将这些信息保存在数据库中,对于每个重新排队,我检查我是否有资格调用Facebook api这是代码片段,用于更好的可视化<?phpnamespace App\Jobs;class FacebookData implements ShouldQueue{ /** * The number of seconds the job can run before timing out. * * @var int */ public $timeout = 120; public $userid; public function __construct($id) { $this->userid=$id; } public function handle() { if($fbhelper->canPullData()) { $res=$fbhelper->getData($user->id); if($res['code']==429) { $fbhelper->storeRetryAfter($res); self::dispatch($user->id); } } }}上面的片段是一个粗略的想法。这是个好主意吗?我发布这个问题的原因是看起来像一个递归,它会尝试直到返回true.这可能需要6分钟.我担心在我的应用程序中会发生任何影响。提前致谢self::dispatch($user->id);$fbhelper->canPullData()
1 回答

开满天机
TA贡献1786条经验 获得超13个赞
重试作业不是一个坏主意,它只是内置于作业设计中。Laravel对此事进行了重试,即工作可以执行不可靠的操作。
作为我一直在处理的项目中的一个例子,我们正在使用的外部API每发送100个请求就有1-5个http 500个错误。这是由 的内置重试功能处理的。Laravel
从5.4开始,您可以在类中设置它。这将完全按照您的要求执行操作,而无需定义逻辑。最后,为了达到重试限制,您可以定义一个名为retryAfter()的函数,该函数指定何时应重试作业。Laravel
class FacebookData {
public $tries = 5;
public function retryAfter() {
//wait 6 minutes
return 360;
}
}
如果你想保持你的逻辑,你只重试429错误,我会使用相反的方法来删除作业,如果它不是429。
if ($res['code'] !== 429) {
$this->delete();
}
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报
0/150
提交
取消