【问题标题】:Shopify API: Exceeded 2 calls per second for api clientShopify API:api 客户端每秒超过 2 次调用
【发布时间】:2021-11-25 13:17:19
【问题描述】:

我在几天前列出的 Shopify 应用上遇到了一个大问题。我的应用程序的核心功能是访问 Shopify API 端点以多次编辑 draft_orders 的端点。我完全清楚每分钟 40 个请求的速率限制和每秒 2 个请求的刷新率。

奇怪的是这些失败请求的时间戳:

PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:09:16
PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:09:18
PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:09:23
PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:09:31
PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:09:47
PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:10:19

所有这些都返回:

Error code: 429 (Too many request)
Error message: REASON: Exceeded 2 calls per second for api client. Reduce request rates to resume uninterrupted service.
Copy 

如您所见,第一个失败的请求和最新的请求之间有超过 1 分钟的时间。所以我完全不知道是什么导致了这个问题。

编辑

我想我可能发现了问题。我(错误地)假设用户只会发出一个请求并等待该请求完成,然后再发送另一个请求。因此,这是我在端点中的代码:

const handleGetRequest = async (req, res) => {
  const {shop, accessToken} = await Shopify.Utils.loadCurrentSession(
    req,
    res
  );

  const client = getShopifyClient(shop, accessToken);
  
  // do stuff with Shopify client

}

getShopifyClient 在哪里:

const getShopifyClient = (shopName, accessToken) => {
  const shopify = new Shopify({
    autoLimit: { calls: 1, interval: 1100, bucketSize: 30 },
    shopName: shopName,
    accessToken: accessToken,
  });

  shopify.on("callLimits", (limits) =>
    console.log(
      `CURRENT API LIMIT STATE: ${util.inspect(
        limits,
        false,
        null,
        true /* enable colors */
      )}`
    )
  );

  shopify.on("callGraphqlLimits", (limits) =>
    console.log(
      `CURRENT API LIMIT STATE: ${util.inspect(
        limits,
        false,
        null,
        true /* enable colors */
      )}`
    )
  );

  return shopify;
};

现在我意识到,每次我收到新请求时,这段代码都会创建一个 Shopify 类的新实例(尽管来自同一个用户,具有相同的商店名称和访问令牌)。

如果是这种情况,如果我发送相同的商店名称,是否可以记住 getShopifyClient 返回相同的实例?像这样的:

let memoizedClient = {}
const getShopifyClient = (shopName, accessToken) => {
  if (memoizedClient[shopName]) {
     return memoizedClient[shopName]
  }
  const shopify = new Shopify({
    autoLimit: { calls: 1, interval: 1100, bucketSize: 30 },
    shopName: shopName,
    accessToken: accessToken,
  });

  shopify.on("callLimits", (limits) =>
    console.log(
      `CURRENT API LIMIT STATE: ${util.inspect(
        limits,
        false,
        null,
        true /* enable colors */
      )}`
    )
  );

  shopify.on("callGraphqlLimits", (limits) =>
    console.log(
      `CURRENT API LIMIT STATE: ${util.inspect(
        limits,
        false,
        null,
        true /* enable colors */
      )}`
    )
  );

  memoizedClient[shopName] = shopify

  return shopify;
};

你怎么看?

【问题讨论】:

    标签: shopify shopify-api shopify-api-node


    【解决方案1】:

    仅通过检查这些错误来推断429s 的原因不足以解释它们!在您发布的日志中,成功的请求不会与失败的请求一起显示。那么,在您不知情的情况下,成功的请求正在用完配额,这不是合理的吗?也许您的日志中包含成功请求和失败请求的日志可能看起来更像这样?

    PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:09:16
    PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [200] 09:09:16
    PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [200] 09:09:16
    PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [200] 09:09:17
    PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [200] 09:09:17
    PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [200] 09:09:18
    PUT https://****.myshopify.com/admin/draft_orders/124016722005.json [429] 09:09:18
    ... and so on
    

    我看到你用shopify-api-node 标记了Q,所以考虑在shopify-api-node 库的构造函数上使用autoLimit option

    const shopify = new Shopify({
      shopName: 'your-shop-name',
      apiKey: 'your-api-key',
      password: 'your-app-password',
      autoLimit: true,
    });
    

    此外,callLimits 事件可能是一个有用的调试/弹性工具。

    【讨论】:

    • 感谢您的回复!我发布的日志没有丢失任何成功调用。这些是唯一的并且连续失败,这就是为什么这很奇怪。另一方面,我已经在使用自动限制配置,实际上我已经降低了阈值以获得更多余量:autoLimit: { calls: 1, interval: 1100, bucketSize: 30 }
    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2018-03-31
    相关资源
    最近更新 更多