为了账号安全,请及时绑定邮箱和手机立即绑定

LARAVEL:重新排队工作是个坏主意吗?

LARAVEL:重新排队工作是个坏主意吗?

PHP
拉丁的传说 2022-07-29 17:03:48
我想知道重新排队 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();

}


查看完整回答
反对 回复 2022-07-29
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信