我想知道重新排队 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); } } }}上面的代码片段是一个粗略的想法。这是一个好主意吗?我发布这个问题的原因是self::dispatch($user->id);看起来像一个递归,它会尝试直到$fbhelper->canPullData()返回 true。这可能需要 6 分钟。我担心我的应用程序会发生任何影响。提前致谢
1 回答
开心每一天1111
TA贡献1836条经验 获得超13个赞
重试工作不是一个坏主意,它只是内置到工作设计中。Laravel 对此进行了重试,认为作业可以进行不可靠的操作。
作为我一直在处理的项目中的一个示例,我们正在使用的外部 API 每发送 100 个请求就有 1-5 个 http 500 错误。这是您由 的内置重试功能处理的Laravel。
从Laravel5.4 开始,您可以像这样在类中设置它。这将完全按照您的意愿进行,而无需定义逻辑。最后,为了达到重试限制,您可以定义一个名为 retryAfter() 的函数,它指定何时重试作业。
class FacebookData {
public $tries = 5;
public function retryAfter() {
//wait 6 minutes
return 360;
}
}
如果你想保持你的逻辑只重试 429 错误,我会使用它的逆来删除作业,如果它不是 429 的话。
if ($res['code'] !== 429) {
$this->delete();
}
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报
0/150
提交
取消