Доля стороннего ограничения скорости API на протяжении сеанса - PullRequest
0 голосов
/ 02 апреля 2019

Я разрабатываю простое приложение, которое использует сторонний API (Shopify REST API), API Shopify регулируется, чтобы разрешать неограниченное количество запросов с течением времени, хотя алгоритм с утечкой памяти, который подробно описан в их документации .

Я использую модуль Shopify-api-node для своих вызовов API, он поддерживает опцию autoLimit из коробки, которая автоматически ограничивает скорость, с которой выполняются запросы, поэтому вы никогда не будете надо думать об ограничениях вызовов API.

Это работает для большинства сценариев Node.js, но вы сталкиваетесь с проблемами в контексте приложения Express, где вам нужно совместно использовать экземпляр API по различным маршрутам через сеанс, потому что опция autoLimit надежна только с одним один Shopify экземпляр.

Вот мой код (обратите внимание, что я создаю новый экземпляр Shopify для каждого маршрута):

var express = require("express");
var session = require("express-session");
var Shopify = require("shopify-api-node");

var app = express();
var port = 3000;

app.use(session({
  secret: "secret",
  resave: false,
  saveUninitialized: true
}));

app.get("/", (req, res) => {
  var shopName = req.session.shopName = req.session.shopName || req.query.shopName;
  var apiKey = req.session.apiKey = req.session.apiKey || req.query.apiKey;
  var password = req.session.password = req.session.password || req.query.password;

  var shopify = new Shopify({ shopName, apiKey, password, autoLimit: true });

  shopify.on("callLimits", (limits) => console.log(limits));

  var requests = Array.from({ length: 100 }, () => {
    return shopify.shop.get()
  });

  Promise.all(requests)
    .then((requestsRes) => {
      return res.send(JSON.stringify(requestsRes));
    })
    .catch((err) => {
      return res.status(500).send(err);
    });
});

app.get("/other-route", (req, res) => {
  var shopName = req.session.shopName = req.session.shopName || req.query.shopName;
  var apiKey = req.session.apiKey = req.session.apiKey || req.query.apiKey;
  var password = req.session.password = req.session.password || req.query.password;

  var shopify = new Shopify({ shopName, apiKey, password, autoLimit: true });

  shopify.on("callLimits", (limits) => console.log(limits));

  var requests = Array.from({ length: 100 }, () => {
    return shopify.product.list()
  });

  Promise.all(requests)
    .then((requestsRes) => {
      return res.send(JSON.stringify(requestsRes));
    })
    .catch((err) => {
      return res.status(500).send(err);
    });
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`)
});

Вот мой package.json:

{
  "name": "third-party-api-limit-issue",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.16.4",
    "express-session": "^1.15.6",
    "shopify-api-node": "^2.18.1"
  }
}

Когда этот скрипт запущен, перейдите по этому URL:

http://localhost:3000? ShopName = liquify-app.myshopify.com & apiKey = 9d1fae34bf670cc71230fee001486e82 и пароль = dc6f650d5921eb40e7ab1e612e9dae7e

Это сделает 100 запросов к Shopify API, сохранит учетные данные API в сеансе и отобразит данные магазина JSON.

Это прерывается, если вы одновременно открываете один и тот же URL на двух вкладках или одновременно открываете http://localhost:3000/other-route. Это происходит потому, что я не могу понять, как использовать один и тот же экземпляр Shopify API для моих маршрутов.

Мне нужно иметь возможность совершать как можно больше вызовов API по всем маршрутам, не сталкиваясь с ошибкой "Too many questions".

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 02 апреля 2019

Я думаю, что у вас есть несоответствие импеданса здесь.У Shopify есть предел.Он точно говорит вам, где вы находитесь.Итак, вы делаете запрос.Заголовок ответа, который вы получите, сообщает, сколько еще запросов вы можете сделать.Это номер, который вы используете.

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

Возможно, попробуйте посмотреть ответ, который вы получили, прежде чем отправлять другой запрос.Если вы достигли предела, сделайте паузу, пока вы немного подождете, пока ведро не зарядится.Стандартные вещи.Хорошо работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...