【问题标题】:Shopify GraphQL Admin API rate limiting cost and sleep timeShopify GraphQL Admin API 速率限制成本和睡眠时间
【发布时间】:2018-11-25 16:38:09
【问题描述】:

我正在尝试在 PHP ( Laravel ) 中使用 Shopify GraphQL API for Admin。
与 REST api 相比,GraphQL api 中的速率限制和节流工作方式不同,它是根据查询的cost计算的。



需要注意的几点:

  • 一次 api 调用(查询)的最大可用成本为 1000。
  • 如果你从1000点消耗了一些点,每秒会恢复50点。
  • 如果您的存储桶中的成本点较少,并且您查询的成本高于此值,它将受到限制。

我传递给 api 的查询的估计成本为 502,由 requestedQueryCost 表示。而 actualQueryCost 表示 api 针对特定商店返回的实际 response

在上面的快照中,这是最坏的情况,对于订单数量很大的商店,requestedQueryCost 等于 acutalQueryCost

现在,执行此查询时,我消耗了 502 个点,还剩 498 个,经过 1 秒,添加了 50 个点 = 548,我可以进行第二次 api 调用以获取第二页数据。在第二次 api 调用之后,我剩下的积分会减少,所以我必须让 sleep 1 或 2 秒才能获得积分才能进行 api 调用。

在快照中显示的情况下,我必须等待 10 秒 休眠才能恢复 500 点 以进行下一次 api 调用。

问题: 如何最好地决定不同商店的睡眠(等待)时间?我们不希望所有商店都等待 10 秒,即使它们的查询成本较低。

注意:有关代码参考,请参阅下面的答案。

【问题讨论】:

  • 查看bulkOperations,您可以在每个商店异步执行 1 个,并且不适用分页或限制。

标签: php laravel graphql shopify shopify-app


【解决方案1】:

您会收到每家商店的一整套成本电话。如果一家商店为零,您可能还有 1000 人在另一家商店等着您。你应该确保你的调用机制是明确的!每个商店只睡一个线程。您应该能够将请求分配给线程,以便在它休眠时您仍在与其他线程一起操作。如果 PHP 使用分配给所有请求的一个线程进行操作,我会大笑的。那将是 1982 年的计算!

【讨论】:

  • 使用 PHP-FPM 和 Nginx,每个请求的新流程。
  • 完美,让您无后顾之忧。休眠不会影响所有商店,只会影响那个线程。
【解决方案2】:

下面是我的一个粗略的解决方案,仍在寻找专家意见如何有效地处理它,以便每个商店都必须根据数据量等待他们应得的时间。请指教。

public function getRequiredOrders()
{
    $firstRequestTimeStamp = now();
    $ordersGraph = $this->shop->api()->graph($this->firstQuery())->body->orders;
    $this->transform($ordersGraph); //transforming to required format

    $previousRequestTimeStamp = $firstRequestTimeStamp;

    while($ordersGraph->pageInfo->hasNextPage) {

        $nextRequestTimeStamp = now();
        $timeElapsed = $nextRequestTimeStamp->diffInSeconds($previousRequestTimeStamp);
        $restoredPoints = $timeElapsed * 50; //50 points are restored every 1 second
        $pointsLeft = $this->shop->api()->getApiCalls('graph', 'left');
        $totalPointsLeft = $pointsLeft + $restoredPoints;

        if($totalPointsLeft >=502){ //one must know the maximum cost of their query
            $lastEdgeCursor = end($ordersGraph->edges)->cursor;
            $nextQuery = $this->nextQuery($lastEdgeCursor);
            $previousRequestTimeStamp = $nextRequestTimeStamp;
            $ordersGraph = $this->shop->api()->graph($nextQuery)->body->orders;
            $this->transform($ordersGraph);
        }else{
            sleep(1);
            continue;
        }

    }
    return $this->allOrders;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2019-06-18
    • 2018-06-10
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多