Shopify GraphQL Admin API ограничение скорости и времени ожидания - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь использовать Shopify GraphQL API для Admin в PHP (Laravel).
Ограничение и регулирование скорости работает в GraphQL api по сравнению с REST api, рассчитывается на основе стоимости запрос.

Cost of Shopify GraphQL query



Несколько моментов, которые следует учитывать:

  • Максимальная доступная стоимость1000 за один вызов API (запрос).
  • Если вы потратили несколько очков из 1000, каждую секунду будут восстанавливаться 50 очков.
  • Если у вас в корзине меньше очков стоимости,и вы сделаете запрос, стоимость которого выше этого, он будет ограничен.

Предполагаемый объем запроса, который я передаю в API, составляет 502 , представленный requestedQueryCost .Принимая во внимание, что actualQueryCost представляет собой фактический ответ , возвращаемый API для определенного магазина.

В приведенном выше снимке, наихудший сценарий, requiredQueryCost равен acutalQueryCost для магазина с большим количеством заказов.

Теперь,когда этот запрос выполнен, я потратил 502 балла, 498 осталось, 1 секунда истекла, добавлено 50 баллов = 548 , и я могу сделать второй вызов API для извлечения второй страницы данных.После второго вызова API у меня останется меньше очков, поэтому мне придется положить sleep на 1 или 2 секунды, чтобы набрать очки для выполнения вызова API.

В случае, показанном на снимке, мне пришлось поставить 10 секунд ожидания ожидания, чтобы восстановить 500 точек , чтобы сделать следующий вызов API.

Проблема: Как лучше всего определить время сна (ожидания) для разных магазинов?Мы не хотим, чтобы все магазины ожидали в течение 10 секунд, даже если у них меньшая стоимость запроса.

Примечание: Информацию о коде см. В моем ответе ниже.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Ниже приведен мой черновой вариант решения, все еще требующий экспертного заключения о том, как эффективно с ним справиться, чтобы каждый магазин ожидал того времени, которого они заслуживают, в зависимости от объема данных.Пожалуйста, порекомендуйте.

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;
}
0 голосов
/ 25 ноября 2018

Вы получаете чистый список стоимости звонков за магазин.Если один магазин в нуле, у вас все еще может быть 1000, ожидающих вас в другом магазине.Вы должны убедиться, что ваш механизм вызова ясно об этом!Только спать нить в магазине.Вы должны быть в состоянии назначить запрос потоку, чтобы, если он спит, вы все еще работали с другими потоками.Я бы рассмеялся, если бы PHP работал с одним потоком, назначенным на все запросы.Это было бы так в 1982 году!

...