【问题标题】:Shopify API : Call limitShopify API:通话限制
【发布时间】:2015-10-19 12:30:06
【问题描述】:

我在进行突发 api 调用时收到“请求过多”429(代码)错误。

这就是我正在做的事情。

同时发出 39 个请求并等待请求完成。如果收到任何请求的响应,立即提出新的另一个请求。随着任何请求的完成,shopify 存储桶中的请求数量应该会减少,并且应该处理新的请求。但我仍然收到“请求过多”错误。

这里是代码sn-p

    // aquire a permit to enter into block
    boundedSemaphore.acquire();

    // Hit the shopify api
    Response response = RestUtils.invoke(URL, operation,
            MediaType.APPLICATION_JSON_TYPE, headerMap, queryParameterMap,
            MediaType.APPLICATION_JSON_TYPE, signatureMethod);

    // Check response       
    if (!RestUtils.isValidStatusCode(response.getStatus())) {
        throw new SystemException("Status :" +response.getStatus());
    }
    if (response.getHeaderString(X_SHOPIFY_SHOP_API_CALL_LIMIT)
            .equalsIgnoreCase("39/40"))
        Thread.sleep(10000);

    // release permit for other threads to enter            
    boundedSemaphore.release();

在任何给定时间,我这边的活跃请求都不超过 39 个。

boundedSemaphore 是 java.util.concurrent.Semaphore,最多允许 39 个。一次只有 39 个线程可以进入这个特定的块。完成任何请求后,信号量将释放许可,新线程将获取它并发出新请求。

Shopify 存储桶大小为 40 个请求,泄漏率为每秒 2 个请求,因此任何请求都不应出现“请求过多”错误。

有谁知道这个问题的原因。

【问题讨论】:

  • 为什么不等待响应并发送另一个睡眠时间较短的请求?

标签: shopify


【解决方案1】:

我认为您可能误解了 Shopify 的请求限制算法。它们将最大请求速率限制为每秒 2 个请求,最多可突发 40 个请求。您发送的每个请求都会增加“存储桶”中的调用次数,并且它们每 1/2 秒就会使存储桶中的 1 个调用过期。这与 Shopify API 是否响应无关。因此,例如,您可以立即发出 40 个请求,但您必须等待至少 1/2 秒才能发送下一个请求。他们只是查看自上次请求以来经过的时间,而不是查看连接是否仍处于打开状态。

我还看到您有一个 Thread.sleep() 调用,但仅当 X_SHOPIFY_SHOP_API_CALL_LIMIT 标头等于 39/40 时。有 2 个潜在问题:

  • 首先,仅当标头返回“39/40”时才会触发此睡眠。只有单个线程会休眠,但另外几个线程可能会立即进行其他调用并收到“40/40”或获得 429 返回码,在这些情况下您将永远不会休眠。

  • 其次,确保 X_SHOPIFY_SHOP_API_CALL_LIMIT 等于“X-Shopify-Shop-Api-Call-Limit”,并且您从 Shopify 收到的标头实际上与此匹配。

https://docs.shopify.com/api/introduction/api-call-limit

【讨论】:

  • 我一般会等待 Shopify 的响应,然后给出 250 毫秒的睡眠定时器。很多,但我可以通过这种方式轻松跟踪每个响应。
  • 我当然希望你不要在生产中使用它。
  • 为什么不应该......?你说的生产是什么意思..?
  • @HymnZ 您的解决方案太慢了,而且您没有根据 Shopify 的反馈在代码中做出逻辑决策。生产的定义见这里:en.wikipedia.org/wiki/Deployment_environment#Production
  • @JJS .. 是的。有罪。早期。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多