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);

           }

        }

     }


}

上面的代码片段是一个粗略的想法。这是一个好主意吗?我发布这个问题的原因是self::dispatch($user->id);看起来像一个递归,它会尝试直到$fbhelper->canPullData()返回 true。这可能需要 6 分钟。我担心我的应用程序会发生任何影响。提前致谢


拉丁的传说
浏览 88回答 1
1回答

开心每一天1111

重试工作不是一个坏主意,它只是内置到工作设计中。Laravel 对此进行了重试,认为作业可以进行不可靠的操作。作为我一直在处理的项目中的一个示例,我们正在使用的外部 API 每发送 100 个请求就有 1-5 个 http 500 错误。这是您由 的内置重试功能处理的Laravel。从Laravel5.4 开始,您可以像这样在类中设置它。这将完全按照您的意愿进行,而无需定义逻辑。最后,为了达到重试限制,您可以定义一个名为 retryAfter() 的函数,它指定何时重试作业。class 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