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

我想知道重新排队一个laravel工作是否是一个坏主意。我有一个场景,一旦用户将Facebook帐户集成到我的应用程序中,我就需要从Facebook上拉出用户的帖子。我想提取{x}天历史数据。Facebook api 像任何其他 api 一样,每分钟有 api 请求的限制。我跟踪请求标头,一旦达到速率限制,我就将这些信息保存在数据库中,对于每个重新排队,我检查我是否有资格调用Facebook api


这是代码片段,用于更好的可视化


<?php


namespace 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()


ITMISS
浏览 114回答 1
1回答

开满天机

重试作业不是一个坏主意,它只是内置于作业设计中。Laravel对此事进行了重试,即工作可以执行不可靠的操作。作为我一直在处理的项目中的一个例子,我们正在使用的外部API每发送100个请求就有1-5个http 500个错误。这是由 的内置重试功能处理的。Laravel从5.4开始,您可以在类中设置它。这将完全按照您的要求执行操作,而无需定义逻辑。最后,为了达到重试限制,您可以定义一个名为retryAfter()的函数,该函数指定何时应重试作业。Laravelclass FacebookData {&nbsp; &nbsp; public $tries = 5;&nbsp; &nbsp; public function retryAfter() {&nbsp; &nbsp; &nbsp; &nbsp; //wait 6 minutes&nbsp; &nbsp; &nbsp; &nbsp; return 360;&nbsp; &nbsp; }}如果你想保持你的逻辑,你只重试429错误,我会使用相反的方法来删除作业,如果它不是429。if ($res['code'] !== 429) {&nbsp; &nbsp; $this->delete();}
打开App,查看更多内容
随时随地看视频慕课网APP