提问者:小点点

Shopify GraphQL管理API速率限制成本和睡眠时间




需要记住的几点:

  • 一次api调用(查询)的最大可用成本为1000
  • 如果你消耗了1000点的点数,每秒将恢复50点
  • 如果你有更少的成本点在你的桶,你提出了一个成本高于这一点的查询,它会节流

我传递给api的查询的估计成本为502,由requestedQueryCost表示。然而,actualQueryCost表示api为特定车间返回的实际响应

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

现在,当执行此查询时,我已经消耗了502个点,剩余498个点,经过了1秒,添加了50个点=548个点,并且我可以进行第二次api调用以获取第二页数据。在第二次api调用之后,我剩下的点数会更少,所以我必须将睡眠时间延长1或2秒,以获得进行api调用所需的点数

在快照中所示的情况下,我必须等待10秒才能恢复500个点以进行下一次api调用<问题:如何最好地确定不同商店的睡眠(等待)时间?我们不希望所有商店等待10秒,即使它们的查询成本更低

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


共2个答案

匿名用户

你可以在每家商店获得一份完整的成本电话记录。如果一家店的价格为零,那么另一家店可能仍有1000英镑在等着你。你应该确保你的呼叫机制是明确的!每家商店只睡一根线。您应该能够将一个请求分配给一个线程,这样,如果它处于Hibernate状态,您仍然可以使用其他线程进行操作。如果PHP运行时为所有请求分配一个线程,我会笑得前仰后合。那太好了!

匿名用户

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

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