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

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

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

PHP
ITMISS 2022-08-19 16:06:42
我想知道重新排队一个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();

}


查看完整回答
反对 回复 2022-08-19
  • 1 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号