Shopify API:通话限制

时间:2015-10-19 12:30:07

标签: shopify

在进行突发api呼叫时,我收到“请求太多”429(代码)错误。

这就是我正在做的事情。

同时发出39个请求并等待请求完成。如果收到任何请求的响应,立即再次发出新的请求。完成任何请求后,shopify桶中的请求数量应减少,并应处理新的请求。但我仍然收到“请求太多”错误。

以下是代码段

    // 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个请求,因此没有请求应该以“请求太多”错误发送。

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

1 个答案:

答案 0 :(得分:3)

我认为您可能会误解Shopify的请求限制算法。它们将最大请求速率限制为每秒2个请求,最多可突发40个请求。您发送的每个请求都会增加" bucket"中的呼叫数量,并且每1/2秒就会从​​桶中呼出1个呼叫。这与Shopify API是否已响应无关。因此,例如,您可以立即执行40个请求,但是在发送下一个请求之前必须等待至少1/2秒。它们纯粹是关注自上次请求以来已经过去的时间,而不是关于连接是否仍然打开。

我还看到您有Thread.sleep()来电,但仅当X_SHOPIFY_SHOP_API_CALL_LIMIT标头等于39/40时才会这样。有两个潜在的问题:

  • 首先,只有当标题返回" 39/40"时才会触发此睡眠。只有那个单独的线程会睡觉,但另一对线程可能会立即拨打其他电话并接收" 40/40"或获得429返回代码,在这种情况下你永远不会睡觉。

  • 其次,请确保X_SHOPIFY_SHOP_API_CALL_LIMIT等于&#34; X-Shopify-Shop-Api-Call-Limit&#34;,以及您从Shopify收到的标题实际上与此匹配。< / p>

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