0 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();
Run Code Online (Sandbox Code Playgroud)
在任何给定时间,我这边的活动请求都不超过 39 个。
boundedSemaphore 是 java.util.concurrent.Semaphore,最多有 39 个许可。一次只有 39 个线程可以进入该特定块。完成任何请求后,信号量将释放许可证,新线程将获取该许可证并发出新请求。
Shopify 存储桶大小为 40 个请求,泄漏率为每秒 2 个请求,因此任何请求都不应出现“请求过多”错误。
有谁知道这个问题的原因是什么。
我认为您可能误解了 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
归档时间: |
|
查看次数: |
7804 次 |
最近记录: |